<?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: Mir Shah</title>
    <description>The latest articles on DEV Community by Mir Shah (@mirshah12).</description>
    <link>https://dev.to/mirshah12</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3772882%2F6fa5a1fc-b364-47a4-8302-54107dba1a04.jpg</url>
      <title>DEV Community: Mir Shah</title>
      <link>https://dev.to/mirshah12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mirshah12"/>
    <language>en</language>
    <item>
      <title>Nyvo is finally live.</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Fri, 21 Aug 2026 17:45:46 +0000</pubDate>
      <link>https://dev.to/mirshah12/nyvo-is-finally-live-486f</link>
      <guid>https://dev.to/mirshah12/nyvo-is-finally-live-486f</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxns9jtdenoxdm4yvohlu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxns9jtdenoxdm4yvohlu.png" alt=" " width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI wallpapers, personalized to you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After a lot of building, testing, breaking things and fixing them again, &lt;strong&gt;Nyvo is officially live on Android.&lt;/strong&gt;&lt;br&gt;
Nyvo creates wallpapers around &lt;strong&gt;you&lt;/strong&gt; and gives your phone something new every day.&lt;br&gt;
The best part? Your next wallpaper can be created and &lt;strong&gt;set automatically&lt;/strong&gt;, without even opening the app.&lt;/p&gt;
&lt;h3&gt;
  
  
  New day. New wallpaper.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=app.nyvo.mobile" rel="noopener noreferrer"&gt;&lt;strong&gt;Try Nyvo on Google Play →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear what you think.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>discuss</category>
      <category>ai</category>
    </item>
    <item>
      <title>PawArt | Letting a Dog Help Create Its Own Portrait</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Sun, 16 Aug 2026 18:10:46 +0000</pubDate>
      <link>https://dev.to/mirshah12/pawart-letting-a-dog-help-create-its-own-portrait-18j3</link>
      <guid>https://dev.to/mirshah12/pawart-letting-a-dog-help-create-its-own-portrait-18j3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-08-13"&gt;Weekend Challenge: Dog Days Edition&lt;/a&gt;&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu1ugzlvlghk6ej6q6c5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu1ugzlvlghk6ej6q6c5n.png" alt="PawArt cover artwork" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;br&gt;&lt;br&gt;&lt;br&gt;
  &lt;/p&gt;
&lt;h1&gt;PawArt&lt;/h1&gt;
&lt;br&gt;
  &lt;h3&gt;Every bark becomes art.&lt;/h3&gt;
&lt;br&gt;
  &lt;p&gt;&lt;strong&gt;Your dog. Their bark. Their masterpiece.&lt;/strong&gt;&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Most pet art begins with a human choosing the colors, the mood, and the style.&lt;/em&gt; But dogs already bring a personality of their own. Their voices can be bright, gentle, restless, or wonderfully dramatic. &lt;strong&gt;PawArt begins there, by listening to the dog and letting the bark guide the canvas.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="100%"&gt;
      &lt;h2&gt;What I Built&lt;/h2&gt;
      &lt;em&gt;The simple idea that started PawArt&lt;/em&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I wanted to answer one playful question:&lt;/p&gt;


&lt;h2&gt;What would a bark look like?&lt;/h2&gt;

&lt;p&gt;PawArt is a mobile app that turns a dog's photo and a few seconds of barking into a unique portrait. I like to explain it this way: the photo tells PawArt &lt;strong&gt;who to paint&lt;/strong&gt;, while the bark helps decide &lt;strong&gt;how to paint them&lt;/strong&gt;.&lt;/p&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="22%"&gt;
&lt;strong&gt;PHOTO&lt;/strong&gt;&lt;br&gt;Meet the artist
&lt;/td&gt;
    &lt;td width="4%"&gt;→&lt;/td&gt;
    &lt;td width="22%"&gt;
&lt;strong&gt;BARK&lt;/strong&gt;&lt;br&gt;Hear their voice
&lt;/td&gt;
    &lt;td width="4%"&gt;→&lt;/td&gt;
    &lt;td width="22%"&gt;
&lt;strong&gt;GEMINI&lt;/strong&gt;&lt;br&gt;Shape the style
&lt;/td&gt;
    &lt;td width="4%"&gt;→&lt;/td&gt;
    &lt;td width="22%"&gt;
&lt;strong&gt;PAWART&lt;/strong&gt;&lt;br&gt;Reveal the portrait
&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;A lively bark might inspire bright color, bold contrast, and restless brushwork. A softer recording might create deeper tones, gentle texture, and more breathing room in the composition. It means the dog has a real influence on the final result instead of simply appearing inside a style someone else picked.&lt;/p&gt;

&lt;p&gt;The result screen reveals the &lt;em&gt;bark fingerprint&lt;/em&gt; behind the piece, including energy, pitch, rhythm, intensity, bark count, and pauses. The original bark can also be replayed beside the artwork it helped create.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One thing that mattered to me:&lt;/strong&gt; PawArt does not claim to translate a dog's thoughts or feelings. It only uses measurable sound characteristics as creative controls for the artwork.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="100%"&gt;
      &lt;h2&gt;Demo&lt;/h2&gt;
      &lt;em&gt;The complete experience in sixty seconds&lt;/em&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h3&gt;One bark becomes a portrait in one minute&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="https://youtu.be/gBsMr20YQrI" rel="noopener noreferrer"&gt;&lt;strong&gt;Watch the demo on YouTube&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;The recording studio and the finished masterpiece.&lt;br&gt;
&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A small note from behind the demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My dog is at home with my family while I am currently staying in a hostel. I used a saved photo and played a recorded bark from another phone. The app still captured that sound and sent it through the real analysis and generation flow shown in the video.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc38wmkjd036pj0go499f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc38wmkjd036pj0go499f.png" alt="PawArt mobile experience showing bark recording and generated artwork screens" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;br&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="100%"&gt;
      &lt;h2&gt;How I Built It&lt;/h2&gt;
      &lt;em&gt;What happens after the record button is pressed&lt;/em&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I wanted the app to feel easy even though quite a lot happens behind it. Once the user taps &lt;strong&gt;Create PawArt&lt;/strong&gt;, the process moves through three small stages.&lt;/p&gt;
&lt;h3&gt;
  
  
  01 · Capture
&lt;/h3&gt;

&lt;p&gt;I built the mobile app with &lt;strong&gt;Expo, React Native, and TypeScript&lt;/strong&gt;. The user chooses a dog photo, records a short bark, and sees a live waveform move with the sound. I spent a lot of time on this part because recording audio can easily feel like filling out a form. I wanted it to feel more like giving the dog a tiny studio session.&lt;/p&gt;

&lt;p&gt;The photo and recording then move into private &lt;strong&gt;Supabase Storage&lt;/strong&gt; buckets. No Google credential ever enters the mobile app.&lt;/p&gt;
&lt;h3&gt;
  
  
  02 · Listen
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Supabase Edge Function&lt;/strong&gt; securely sends both the photo and audio to &lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt; through Google's official API.&lt;/p&gt;

&lt;p&gt;Gemini looks for measurable qualities such as energy, pitch, rhythm, intensity, bark count, and pauses. &lt;em&gt;PawArt then turns those qualities into a visual language.&lt;/em&gt;&lt;/p&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;HIGH ENERGY&lt;/strong&gt;&lt;br&gt;Dynamic composition
&lt;/td&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;BRIGHT PITCH&lt;/strong&gt;&lt;br&gt;Luminous palette
&lt;/td&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;RAPID RHYTHM&lt;/strong&gt;&lt;br&gt;Active brushwork
&lt;/td&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;STRONG SOUND&lt;/strong&gt;&lt;br&gt;Bold contrast
&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;&amp;gt; &lt;strong&gt;Style:&lt;/strong&gt; Expressive impressionism&lt;br&gt;
&amp;gt; &lt;strong&gt;Palette:&lt;/strong&gt; Warm gold, orange, and crimson&lt;br&gt;
&amp;gt; &lt;strong&gt;Composition:&lt;/strong&gt; Energetic and alive&lt;br&gt;
&amp;gt; &lt;strong&gt;Brushwork:&lt;/strong&gt; Sweeping and bold&lt;/p&gt;

&lt;p&gt;I chose a structured response because I did not want the generated image to feel random. It lets the app show &lt;em&gt;how the voice influenced the canvas&lt;/em&gt;, and it also keeps each stage predictable enough to build around.&lt;/p&gt;
&lt;h3&gt;
  
  
  03 · Paint
&lt;/h3&gt;

&lt;p&gt;The original photo and the new art direction are passed to &lt;strong&gt;Gemini 3.1 Flash Image&lt;/strong&gt;, also known as &lt;strong&gt;Nano Banana 2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The prompt asks the model to preserve the dog's recognizable eyes, ears, muzzle, coat colors, markings, and proportions. The bark still controls the visual treatment, so &lt;em&gt;a different recording creates a meaningfully different portrait.&lt;/em&gt; Getting this balance right was the most interesting part of the build.&lt;/p&gt;


&lt;h3&gt;One dog. A different bark. A different canvas.&lt;/h3&gt;

&lt;h3&gt;
  
  
  Why I chose Supabase
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;Supabase&lt;/strong&gt; because it gave me one place for the files, database, and server logic. More importantly, it meant the Google API key could stay on the server instead of ending up inside the Expo app.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;STORAGE&lt;/strong&gt;&lt;br&gt;Private photos, audio, and art
&lt;/td&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;EDGE FUNCTION&lt;/strong&gt;&lt;br&gt;Secure Google AI requests
&lt;/td&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;POSTGRES&lt;/strong&gt;&lt;br&gt;Bark and artwork metadata
&lt;/td&gt;
    &lt;td width="25%"&gt;
&lt;strong&gt;SIGNED URLS&lt;/strong&gt;&lt;br&gt;Temporary access to results
&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;The repository includes the database migration, private Storage buckets, file restrictions, Row Level Security policies, secrets configuration, and Edge Function deployment steps. The complete walkthrough is available in the &lt;strong&gt;&lt;a href="https://github.com/abbasmir12/pawart#supabase-setup" rel="noopener noreferrer"&gt;Supabase setup guide&lt;/a&gt;&lt;/strong&gt; inside the README.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="100%"&gt;
      &lt;h2&gt;Code&lt;/h2&gt;
      &lt;em&gt;Run it, inspect it, or build on top of it&lt;/em&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;PawArt is open source.&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;The repository contains the Expo app, Supabase backend, database migration, and Google AI Edge Function.&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/abbasmir12" rel="noopener noreferrer"&gt;
        abbasmir12
      &lt;/a&gt; / &lt;a href="https://github.com/abbasmir12/pawart" rel="noopener noreferrer"&gt;
        pawart
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/abbasmir12/pawart/assets/brand/pawart-icon.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fabbasmir12%2Fpawart%2FHEAD%2Fassets%2Fbrand%2Fpawart-icon.png" alt="PawArt app icon" width="168"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PawArt&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Every bark becomes art.&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Your dog. Their bark. Their masterpiece.&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/91e8d20ed397b45970767f2d4eecf6f1be5a5bd648d677af5b9fcd1d345e9b7a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4578706f2d35342d3030303032303f7374796c653d666c61742d737175617265266c6f676f3d6578706f"&gt;&lt;img alt="Expo" src="https://camo.githubusercontent.com/91e8d20ed397b45970767f2d4eecf6f1be5a5bd648d677af5b9fcd1d345e9b7a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4578706f2d35342d3030303032303f7374796c653d666c61742d737175617265266c6f676f3d6578706f"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bcd7d85304000193f0d9a53cb775d9ffc7467f59b9e8133f413bc1d85beeedc9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163745f4e61746976652d547970655363726970742d3230323332413f7374796c653d666c61742d737175617265266c6f676f3d7265616374"&gt;&lt;img alt="React Native" src="https://camo.githubusercontent.com/bcd7d85304000193f0d9a53cb775d9ffc7467f59b9e8133f413bc1d85beeedc9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163745f4e61746976652d547970655363726970742d3230323332413f7374796c653d666c61742d737175617265266c6f676f3d7265616374"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/668604d3c0182bcce5ffa06a18497ab4f0735e092991935d040de40d38268dcf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53757061626173652d4261636b656e642d3346434638453f7374796c653d666c61742d737175617265266c6f676f3d7375706162617365266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="Supabase" src="https://camo.githubusercontent.com/668604d3c0182bcce5ffa06a18497ab4f0735e092991935d040de40d38268dcf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53757061626173652d4261636b656e642d3346434638453f7374796c653d666c61742d737175617265266c6f676f3d7375706162617365266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/29dd7211b24cbfd47e6aaed4bb47f1c9ef34e67429d6857777a5cde01260b03c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f6f676c655f47656d696e692d41492d3432383546343f7374796c653d666c61742d737175617265266c6f676f3d676f6f676c65"&gt;&lt;img alt="Google Gemini" src="https://camo.githubusercontent.com/29dd7211b24cbfd47e6aaed4bb47f1c9ef34e67429d6857777a5cde01260b03c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f6f676c655f47656d696e692d41492d3432383546343f7374796c653d666c61742d737175617265266c6f676f3d676f6f676c65"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;DEV Weekend Challenge: Dog Days Edition&lt;/strong&gt;&lt;br&gt;
Competing for &lt;strong&gt;Best Use of Google AI&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is PawArt?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;PawArt is a mobile creative studio that turns a dog's photo and a short bark recording into a recognizable, one-of-a-kind portrait.&lt;/p&gt;
&lt;p&gt;The bark is not treated as a secret language. PawArt measures acoustic characteristics—energy, pitch, rhythm, intensity, bark count, pauses, and duration—and uses them as creative controls for palette, composition, contrast, and brushwork.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PawArt never claims to translate a dog's thoughts, needs, intentions, or emotions. Sound characteristics guide the artwork only.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The experience&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;Step&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;01 · Add a photo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Take a clear dog photo or choose one from the gallery.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;02 · Record the bark&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Capture 3–10 seconds with a live microphone waveform.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;03 · Read the sound&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemini analyzes measurable acoustic characteristics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;04 · Find the art&lt;/strong&gt;&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/abbasmir12/pawart" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;Want to create your own PawArt?&lt;/h3&gt;
&lt;br&gt;
  &lt;p&gt;Everything needed to run, understand, and extend the project is waiting in the repository.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="33%"&gt;
      &lt;a href="https://github.com/abbasmir12/pawart" rel="noopener noreferrer"&gt;&lt;strong&gt;OPEN THE SOURCE&lt;/strong&gt;&lt;/a&gt;
      &lt;br&gt;&lt;br&gt;
      Explore the complete PawArt code
    &lt;/td&gt;
    &lt;td width="33%"&gt;
      &lt;a href="https://github.com/abbasmir12/pawart#supabase-setup" rel="noopener noreferrer"&gt;&lt;strong&gt;BUILD IT YOURSELF&lt;/strong&gt;&lt;/a&gt;
      &lt;br&gt;&lt;br&gt;
      Follow the full Supabase guide
    &lt;/td&gt;
    &lt;td width="34%"&gt;
      &lt;a href="https://github.com/abbasmir12/pawart#security-model" rel="noopener noreferrer"&gt;&lt;strong&gt;SEE HOW IT IS SECURED&lt;/strong&gt;&lt;/a&gt;
      &lt;br&gt;&lt;br&gt;
      Understand secrets and private files
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="100%"&gt;
      &lt;h2&gt;Prize Categories&lt;/h2&gt;
      &lt;em&gt;Best Use of Google AI&lt;/em&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;One model listens. One model paints.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;h3&gt;Gemini 3.7 Flash&lt;/h3&gt;
      &lt;p&gt;Studies the photo and bark, then writes the creative direction.&lt;/p&gt;
    &lt;/td&gt;
    &lt;td width="50%"&gt;
      &lt;h3&gt;Nano Banana 2&lt;/h3&gt;
      &lt;p&gt;Preserves the dog and turns that direction into the final portrait.&lt;/p&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Google AI is at the center of the idea, rather than being something I added just to qualify for the category. Gemini turns an ordinary recording into useful art direction. Nano Banana 2 turns that direction into an image while keeping the actual dog recognizable. &lt;em&gt;Together, they connect the dog's voice to the finished canvas.&lt;/em&gt;&lt;/p&gt;








&lt;h2&gt;Every dog already has a voice.&lt;/h2&gt;
&lt;br&gt;
  &lt;h3&gt;PawArt gives that voice a canvas.&lt;/h3&gt;



&lt;p&gt;I built PawArt because the small sounds we hear every day can hold memories. A familiar bark is part of a dog's personality and part of the feeling of having them nearby. Turning it into art feels more personal to me than adding a filter to a photo. The final portrait is shaped by both how the dog looks and how they sound.&lt;/p&gt;

&lt;p&gt;PawArt started as a fun weekend idea, but somewhere during the build it began to feel like a small way of saving a moment with a companion. If someone uses it, smiles at the result, and immediately wants to try another bark, then it has done exactly what I hoped it would do.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
  &lt;strong&gt;Your dog. Their bark. Their masterpiece.&lt;/strong&gt;&lt;br&gt;
  &lt;br&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9d8kcf6vhiwzmvcugyh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9d8kcf6vhiwzmvcugyh6.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;em&gt;Every bark becomes art.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>development</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Used Sentry to Expose a Silent Data-Loss Bug with Zero Errors</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Sat, 15 Aug 2026 15:08:13 +0000</pubDate>
      <link>https://dev.to/mirshah12/i-used-sentry-to-expose-a-silent-data-loss-bug-with-zero-errors-hmi</link>
      <guid>https://dev.to/mirshah12/i-used-sentry-to-expose-a-silent-data-loss-bug-with-zero-errors-hmi</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Clear the Lineup&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;






&lt;div class="crayons-card c-embed"&gt;

  
&lt;h3&gt;
  
  
  40 successful saves. 39 missing workspaces.
&lt;/h3&gt;

&lt;p&gt;The application did not crash. No exception was thrown. &lt;strong&gt;Every promise resolved.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that was exactly why this bug was dangerous.&lt;br&gt;

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


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The front-page lesson:&lt;/strong&gt; A green “success” proves that an operation finished. It does not prove that its result is still there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;THE FOUR-MINUTE FIELD REPORT&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;

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

&lt;p&gt;
  &lt;strong&gt;IN THIS EDITION&lt;/strong&gt;&lt;br&gt;
  The project &amp;nbsp;·&amp;nbsp;
  The incident &amp;nbsp;·&amp;nbsp;
  The patch &amp;nbsp;·&amp;nbsp;
  The safeguards &amp;nbsp;·&amp;nbsp;
  The signal
&lt;/p&gt;





&lt;p&gt;SECTION I · THE PROJECT DESK&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;Last month, I built &lt;strong&gt;Aether Canvas&lt;/strong&gt; during OpenAI Build Week.&lt;/p&gt;

&lt;p&gt;It is a local-first Electron application where spatially grouping ordinary files creates the mini-app you need. Put a flight confirmation, hotel booking, budget, packing list, and city guide together, for example, and Aether turns the cluster into a living trip workspace with routes, spending, tasks, and places—all traceable to the source files.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Space is the prompt.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But the build was anything but simple. It was a one-week hackathon, and those seven days had to cover validating the idea, designing the architecture, building the interface, connecting the AI workflow, testing the main experience, and preparing the final demo and presentation.&lt;/p&gt;

&lt;p&gt;We shipped a working product. We did not have enough time for deep concurrency and persistence stress testing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;WHAT WE SHIPPED&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      A real local-first Electron product: spatial files, AI-generated workspaces, autosave, persistence, and a polished demo path.
    &lt;/td&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;WHAT THE CLOCK HID&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      The main experience worked, but the one-week schedule left little room for simultaneous-operation and shutdown stress tests.
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I also chose not to modify the original submitted repository before the winner announcement. I wanted the artifact being judged to remain exactly as submitted. Instead, I created a &lt;a href="https://gitlab.com/abbasmir12/aether-canva-bugsmash" rel="noopener noreferrer"&gt;separate Bug Smash repository&lt;/a&gt;, with the submission preserved at &lt;a href="https://gitlab.com/abbasmir12/aether-canva-bugsmash/-/commit/3163641a4cfbf13f551f4799cde37079ec6a5bb0" rel="noopener noreferrer"&gt;commit &lt;code&gt;3163641a&lt;/code&gt;&lt;/a&gt; and tagged &lt;a href="https://gitlab.com/abbasmir12/aether-canva-bugsmash/-/tags/openai-hackathon-submission" rel="noopener noreferrer"&gt;&lt;code&gt;openai-hackathon-submission&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That gave me something unusually valuable for debugging: an untouched before state.&lt;/p&gt;





&lt;p&gt;SECTION II · INCIDENT REPORT&lt;/p&gt;
&lt;h2&gt;
  
  
  Bug Fix or Performance Improvement
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The bug hid behind successful writes
&lt;/h3&gt;

&lt;p&gt;Aether stores each workspace in its own JSON file and keeps a separate index containing the workspaces visible in the sidebar.&lt;/p&gt;

&lt;p&gt;The original implementation already used atomic temporary-file replacement and a write queue. At first glance, that looked safe. After tracing the workspace IPC calls, autosave path, rename path, and persistence service, I found the boundary was in the wrong place.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;✓ WHAT WAS SAFE&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      Each individual JSON replacement was atomic. A partial write would not leave behind a half-written index.
    &lt;/td&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;✕ WHAT WAS NOT SAFE&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      The read and modification happened before the queued write, so two complete operations could still overwrite one another.
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The queue protected an individual JSON write:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;operation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;writeQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;temporaryPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;temporaryPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But updating the workspace index is not one write. It is a complete &lt;strong&gt;read → modify → write&lt;/strong&gt; transaction:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create A: read index [] ── add A ── write [A]
Create B: read index [] ── add B ── write [B]
                                      ▲
                     both writes succeed; A disappears from the index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Two operations could read the same old index before either write entered the queue. Both would make a perfectly valid update. Both writes would complete successfully. The last valid-but-stale snapshot would win.&lt;/p&gt;

&lt;p&gt;No malformed JSON. No rejected promise. No crash for error monitoring to catch.&lt;/p&gt;

&lt;p&gt;Just a workspace file that still existed on disk but was no longer reachable from the application.&lt;/p&gt;
&lt;h3&gt;
  
  
  Making a timing bug repeatable
&lt;/h3&gt;

&lt;p&gt;I did not want to hammer the UI with clicks until I got lucky. I built deterministic before/after harnesses that run the same workloads against two real implementations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;🔴 BEFORE&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      Loads the authentic workspace service directly from submitted commit &lt;code&gt;3163641a&lt;/code&gt; with &lt;code&gt;git show&lt;/code&gt;—not from a hand-written broken copy.
    &lt;/td&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;🟢 AFTER&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      Loads the repaired service from the Bug Smash branch and subjects it to the exact same operations and assertions.
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The workload creates &lt;strong&gt;40 workspaces simultaneously&lt;/strong&gt;, then runs &lt;strong&gt;20 autosave-versus-rename races&lt;/strong&gt;. Each stage uses an isolated temporary Electron profile, opens the real desktop UI with the resulting data, and deletes that data after the window closes. My actual Aether spaces are never touched.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run bugsmash:before &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--sentry&lt;/span&gt;
npm run bugsmash:after &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--sentry&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The harness also refuses to present an inconclusive result: the before stage must reproduce the legacy failure, and the after stage must preserve every mutation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Identical workload&lt;/th&gt;
      &lt;th&gt;Original submission&lt;/th&gt;
      &lt;th&gt;Repaired version&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Workspace files written&lt;/td&gt;
      &lt;td&gt;40 / 40&lt;/td&gt;
      &lt;td&gt;40 / 40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Workspaces reachable in the index&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;1 / 40&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;40 / 40&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Orphaned workspace files&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;39&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Autosave/rename trials that lost a mutation&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;20 / 20&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0 / 20&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;div class="crayons-card c-embed"&gt;

  
&lt;h3&gt;
  
  
  The number that changed the investigation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;40 files existed on disk. Only one existed to the user.&lt;/strong&gt;&lt;/p&gt;


&lt;/div&gt;






&lt;p&gt;SECTION III · THE PATCH DESK&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CASE FILE&lt;/th&gt;
&lt;th&gt;EVIDENCE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Merge request&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/abbasmir12/aether-canva-bugsmash/-/merge_requests/1" rel="noopener noreferrer"&gt;Review Merge Request !1 and the complete diff&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Repair commit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/abbasmir12/aether-canva-bugsmash/-/commit/57fc12a0922709a1a203594711fe9e83404ec984" rel="noopener noreferrer"&gt;&lt;code&gt;57fc12a&lt;/code&gt; — transaction-safe persistence&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public repository&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/abbasmir12/aether-canva-bugsmash" rel="noopener noreferrer"&gt;Aether Canvas Bug Smash&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The heart of the repair is intentionally small. A failure-safe exclusive queue now surrounds the &lt;strong&gt;complete public operation&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;runExclusive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pendingOperations&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;queued&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;operationQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;operationQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;queued&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;queued&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pendingOperations&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every workspace mutation now crosses that boundary as one unit:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runExclusive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;readIndex&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runExclusive&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runExclusive&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;readJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt;
  &lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runExclusive&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="na"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runExclusive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;workspace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Untitled Space&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now a create or rename finishes reading, modifying, and persisting its state before the next operation begins. A rejected operation is absorbed only for queue continuity and is still returned to its original caller, so one disk failure cannot permanently poison later saves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/abbasmir12/aether-canva-bugsmash" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Explore the complete before/after repository&lt;/a&gt;
&lt;/p&gt;





&lt;p&gt;SECTION IV · ENGINEERING FOLLOW-THROUGH&lt;/p&gt;
&lt;h2&gt;
  
  
  My Improvements
&lt;/h2&gt;

&lt;p&gt;Fixing the index race exposed two nearby assumptions that also needed attention. I treated this as one persistence-integrity repair rather than stopping at the first passing test.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;01 · TRANSACTION BOUNDARY&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      One long-lived store and one exclusive queue protect every complete persistence operation.
    &lt;/td&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;02 · SAVE REVISIONS&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      A newer edit cannot be cleared by the completion of an older in-flight save.
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;03 · CLOSE HANDSHAKE&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      Electron waits for the renderer's latest snapshot before destroying the window.
    &lt;/td&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;04 · REGRESSION PROOF&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      Six deterministic tests protect the failure modes instead of merely mirroring the implementation.
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  1. One store, one transaction queue
&lt;/h3&gt;

&lt;p&gt;The Electron main process now keeps one long-lived workspace store across IPC handlers. Creating a new store per request would create multiple queues and quietly defeat serialization.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Revision-aware autosaving
&lt;/h3&gt;

&lt;p&gt;The renderer previously used a boolean dirty flag. That is not enough when a new edit arrives while an older save is still running: completion of the older save can clear the flag belonging to the newer edit.&lt;/p&gt;

&lt;p&gt;The new saver tracks revisions and drains until the saved revision catches the latest one:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latest&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;savedRevision&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revision&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;revision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revision&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;savedRevision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;revision&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If revision 2 arrives while revision 1 is being written, revision 1 cannot declare revision 2 safe. The loop writes again.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. A real close handshake
&lt;/h3&gt;

&lt;p&gt;An asynchronous &lt;code&gt;beforeunload&lt;/code&gt; callback cannot force Electron to wait before destroying its renderer. The main process now intercepts the close request, asks the renderer to drain its latest snapshot, and closes the native window only after the renderer acknowledges completion.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Regression tests for the failure, not just the implementation
&lt;/h3&gt;

&lt;p&gt;The six deterministic tests cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40 concurrent creates preserving 40 unique index entries;&lt;/li&gt;
&lt;li&gt;autosave racing rename while preserving both mutations;&lt;/li&gt;
&lt;li&gt;queue recovery after a rejected operation;&lt;/li&gt;
&lt;li&gt;a newer edit arriving during an active save;&lt;/li&gt;
&lt;li&gt;retrying a failed snapshot write without losing dirty state; and&lt;/li&gt;
&lt;li&gt;count-only integrity auditing for orphaned and missing files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strict TypeScript checks, the renderer/main/preload production builds, and Linux AppImage packaging also pass with the repair.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Reproduce the controlled comparison locally
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://gitlab.com/abbasmir12/aether-canva-bugsmash.git
&lt;span class="nb"&gt;cd &lt;/span&gt;aether-canva-bugsmash
git switch fix/workspace-transaction-race
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npx vite build

&lt;span class="c"&gt;# Run each stage separately so the real Electron state remains visible.&lt;/span&gt;
npm run bugsmash:before
npm run bugsmash:after

&lt;span class="c"&gt;# Or print both results without opening two staged windows.&lt;/span&gt;
npm run bugsmash:demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The Sentry flag requires your own DSN. The reproduction itself does not.&lt;/p&gt;



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





&lt;p&gt;SECTION V · OBSERVABILITY DESK&lt;/p&gt;
&lt;h2&gt;
  
  
  Best Use of Sentry
&lt;/h2&gt;

&lt;p&gt;I am submitting this entry for &lt;strong&gt;Best Use of Sentry&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sentry had a specific job here: make a silent logical invariant observable.&lt;/p&gt;

&lt;p&gt;It would be inaccurate to say that Sentry magically discovered the source line or repaired the race. Code inspection and deterministic stress tests found the transaction-boundary bug. Sentry then gave me runtime evidence that the application could report successful operations while its persisted state was inconsistent—and confirmed that the repaired build remained consistent under the identical workload.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;WHAT SENTRY DID&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      Recorded queue pressure, operation duration, and the count-only workspace integrity invariant in the running Electron application.
    &lt;/td&gt;
    &lt;td width="50%"&gt;
      &lt;strong&gt;WHAT SENTRY DID NOT DO&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
      It did not invent the root cause or upload the user's workspace. Code inspection and tests located the faulty transaction boundary.
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Operation tracing
&lt;/h3&gt;

&lt;p&gt;Using the Sentry Electron SDK, every workspace IPC operation creates a custom transaction containing only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the operation type, such as &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;save&lt;/code&gt;, or &lt;code&gt;rename&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;queue depth; and&lt;/li&gt;
&lt;li&gt;duration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made serialization pressure visible. For example, an authenticated &lt;code&gt;workspace.create&lt;/code&gt; trace showed a queue depth of 10 and a root duration of approximately 175 ms. A successful span status alone, however, could not reveal the hidden loss. For that I needed a product-level invariant.&lt;/p&gt;
&lt;h3&gt;
  
  
  The integrity transaction
&lt;/h3&gt;

&lt;p&gt;The opt-in &lt;code&gt;workspace.integrity-audit&lt;/code&gt; compares the index with the workspace directory locally and reports only aggregate counts:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aether.workspace.files_count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;workspaceFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aether.workspace.indexed_count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexedWorkspaces&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aether.workspace.orphaned_count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orphanedFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aether.workspace.missing_file_count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;missingFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aether.workspace.integrity_consistent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;consistent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;consistent&lt;/span&gt;
  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data_loss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The original run produced:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;files_count          40
indexed_count         1
orphaned_count       39
integrity_consistent false
status               data_loss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The repaired run produced:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;files_count          40
indexed_count        40
orphaned_count        0
integrity_consistent true
status               ok
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
      &lt;tbody&gt;
&lt;tr&gt;
        &lt;td width="48%"&gt;
          &lt;strong&gt;🔴 BEFORE&lt;/strong&gt;&lt;br&gt;
          SILENT DATA LOSS&lt;br&gt;&lt;br&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjw6xtajl7rmt9szjim2q.png" width="800" height="428"&gt;&lt;br&gt;
          &lt;strong&gt;40 files · 1 indexed&lt;/strong&gt;&lt;br&gt;
          &lt;strong&gt;39 orphaned · data_loss&lt;/strong&gt;
        &lt;/td&gt;
        &lt;td width="4%"&gt;
          │&lt;br&gt;│&lt;br&gt;│&lt;br&gt;│&lt;br&gt;│&lt;br&gt;│&lt;br&gt;│&lt;br&gt;│&lt;br&gt;│
        &lt;/td&gt;
        &lt;td width="48%"&gt;
          &lt;strong&gt;🟢 AFTER&lt;/strong&gt;&lt;br&gt;
          INTEGRITY RESTORED&lt;br&gt;&lt;br&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3z29u2yco2z71xrom1k.png" width="800" height="426"&gt;&lt;br&gt;
          &lt;strong&gt;40 files · 40 indexed&lt;/strong&gt;&lt;br&gt;
          &lt;strong&gt;0 orphaned · ok&lt;/strong&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;THE TRACE'S STRANGEST HEADLINE&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;Issues: 0 &amp;nbsp;·&amp;nbsp; Orphaned workspaces: 39&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional exception monitoring was telling the truth—nothing threw. The integrity transaction supplied the missing definition of correctness.&lt;/p&gt;
&lt;h3&gt;
  
  
  Observability without uploading the workspace
&lt;/h3&gt;

&lt;p&gt;Aether is local-first, so the instrumentation had to respect that promise. The custom telemetry never includes workspace names, IDs, paths, file contents, canvas content, AI prompts, or AI responses. Transaction hooks remove user, request, extra, and breadcrumb payloads; UI-click breadcrumbs are disabled; raw IP storage is disabled in the Sentry project; and an advanced scrubbing rule removes &lt;code&gt;user.geo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This was also a useful lesson: observability is not only about collecting more information. Sometimes it is about identifying the &lt;strong&gt;smallest safe signal&lt;/strong&gt; that proves the system is healthy.&lt;/p&gt;





&lt;p&gt;FINAL EDITION · THE QUIETEST FIXES CAN PROTECT THE MOST IMPORTANT DATA&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  
&lt;h3&gt;
  
  
  A deliberately boring result
&lt;/h3&gt;

&lt;p&gt;Save a workspace, and it stays saved.&lt;/p&gt;

&lt;p&gt;That is the point.&lt;/p&gt;

&lt;p&gt;No flashy new feature, just &lt;strong&gt;39 workspaces recovered in the controlled stress scenario&lt;/strong&gt;, zero lost autosave mutations, and a save operation that finally means &lt;em&gt;saved&lt;/em&gt;.&lt;br&gt;

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



</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>ai</category>
      <category>development</category>
    </item>
    <item>
      <title>I hate my scattered documents &amp; file, so I built this canvas</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Mon, 27 Jul 2026 10:05:59 +0000</pubDate>
      <link>https://dev.to/mirshah12/this-open-source-canvas-replaced-my-file-system-1gpc</link>
      <guid>https://dev.to/mirshah12/this-open-source-canvas-replaced-my-file-system-1gpc</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for &lt;a href="https://openai.com/build-week/" rel="noopener noreferrer"&gt;OpenAI Build Week&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Aether Canvas
&lt;/h1&gt;

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

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

&lt;p&gt;&lt;/p&gt;  &lt;span class="ltag-quote__identity"&gt; &lt;span class="ltag-quote__author"&gt;Aether Canvas&lt;/span&gt; &lt;span class="ltag-quote__role"&gt;A spatial workspace that builds itself&lt;/span&gt; &lt;/span&gt;  &lt;blockquote class="ltag-quote__body"&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
I built a workspace that reads your files and decides what it should be.&lt;br&gt; &lt;/div&gt; &lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;

&lt;p&gt;An actual desktop app where you drop PDFs, spreadsheets, documents, notes, and images onto an infinite canvas, and it reads all of them, works out what connects them, and generates an interactive workspace shaped by what it found. Different files produce a different workspace. That's the whole point.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Here's the observation it started from. A folder is a container. It holds your files and it has never once understood them. Every piece of software we use to organize knowledge throws away the two most useful signals we give it: what's actually inside the documents, and how we chose to arrange them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I tried to build the opposite. Something where both of those signals are the input.&lt;/p&gt;


&lt;div class="ltag-offer"&gt;
  &lt;div class="ltag-offer__body"&gt;
&lt;br&gt;
It's called &lt;strong&gt;Aether Canvas&lt;/strong&gt;. You drop files anywhere on the canvas. It reads what's inside them, discovers the relationships across formats, and builds a view around that context. Ask a question against the entire workspace and every answer traces back to the file and location it came from. Local-first, so the workspace never leaves your machine.&lt;br&gt;
&lt;/div&gt;
&lt;/div&gt;





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

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

&lt;p&gt;&lt;/p&gt;
  Why it's a desktop app and not a web demo
  &lt;p&gt;Aether is local-first by design. Your files stay on your machine, the workspace index is written to local storage, and nothing gets uploaded to a server to be processed and held.&lt;/p&gt;

&lt;p&gt;A hosted demo would mean the opposite of that. So instead of a link that borrows your files, there's an installer that runs on yours.&lt;/p&gt;



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




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;


&lt;div class="ltag-offer"&gt;
  &lt;div class="ltag-offer__body"&gt;
&lt;br&gt;
&lt;strong&gt;You don't have to build it.&lt;/strong&gt; There's a signed installer — v1.0.0, Windows x64, no build step and no keys to paste in.&lt;br&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/abbasmir12/aether-canvas/releases/download/v1.0.0/Aether-Canvas-Setup-1.0.0-x64.exe" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Download Aether Canvas for Windows&lt;/a&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Install it, drag a folder onto the empty canvas, and wait for the edges to appear. Then ask it something you'd normally have to open six files to answer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;
  Prefer to build from source
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/abbasmir12/aether-canvas
&lt;span class="nb"&gt;cd &lt;/span&gt;aether-canvas
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




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




&lt;h2&gt;
  
  
  Code
&lt;/h2&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/abbasmir12" rel="noopener noreferrer"&gt;
        abbasmir12
      &lt;/a&gt; / &lt;a href="https://github.com/abbasmir12/aether-canvas" rel="noopener noreferrer"&gt;
        aether-canvas
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A generative desktop where dropping files onto a spatial canvas builds living, AI-powered workspaces — powered by GPT-5.6. Space is the prompt.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/abbasmir12/aether-canvas/public/aether-logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fabbasmir12%2Faether-canvas%2FHEAD%2Fpublic%2Faether-logo.png" alt="Aether Canvas" width="84"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Aether Canvas&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;Space is the prompt.&lt;/strong&gt;&lt;br&gt;
  A generative desktop where grouping ordinary files creates the mini-app you need
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;OpenAI Build Week 2026&lt;/strong&gt; &amp;nbsp;·&amp;nbsp;
  Apps for Your Life &amp;nbsp;·&amp;nbsp;
  Built with Codex + GPT-5.6
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://youtu.be/iPBvw5U4J8A" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Watch the demo&lt;/strong&gt;&lt;/a&gt;
  &amp;nbsp;&amp;nbsp;·&amp;nbsp;&amp;nbsp;
  &lt;a href="https://devpost.com/software/aether-canvas" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Devpost&lt;/strong&gt;&lt;/a&gt;
  &amp;nbsp;&amp;nbsp;·&amp;nbsp;&amp;nbsp;
  &lt;a href="https://github.com/abbasmir12/aether-canvas#see-aether-in-action" rel="noopener noreferrer"&gt;&lt;strong&gt;See the product&lt;/strong&gt;&lt;/a&gt;
  &amp;nbsp;&amp;nbsp;·&amp;nbsp;&amp;nbsp;
  &lt;a href="https://github.com/abbasmir12/aether-canvas#run-aether" rel="noopener noreferrer"&gt;&lt;strong&gt;Run Aether&lt;/strong&gt;&lt;/a&gt;
  &amp;nbsp;&amp;nbsp;·&amp;nbsp;&amp;nbsp;
  &lt;a href="https://github.com/abbasmir12/aether-canvas#how-gpt-56-powers-aether" rel="noopener noreferrer"&gt;&lt;strong&gt;GPT-5.6&lt;/strong&gt;&lt;/a&gt;
  &amp;nbsp;&amp;nbsp;·&amp;nbsp;&amp;nbsp;
  &lt;a href="https://github.com/abbasmir12/aether-canvas#how-codex-accelerated-the-build" rel="noopener noreferrer"&gt;&lt;strong&gt;Build story&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/abbasmir12/aether-canvas/docs/media/aether-canvas-hero.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fabbasmir12%2Faether-canvas%2FHEAD%2Fdocs%2Fmedia%2Faether-canvas-hero.png" alt="Aether Canvas turns five travel files into a living Tokyo Trip workspace" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Five source files, four semantic streams, one GPT-generated interactive workspace—captured from the running Electron app.
&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Five files in. One living workspace out.&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;
  A normal folder sees filenames. Aether sees the trip, project, course, budget, or plan they describe together.
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;CONCEPTUAL WORKFLOW · CLICK A CHAPTER&lt;/strong&gt;&lt;br&gt;
  A hand-drawn explanation of the idea, not a screenshot of the application. Select any panel to inspect the real files, architecture, or product evidence behind it.
&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

  &lt;tbody&gt;

&lt;tr&gt;

    &lt;td width="33%"&gt;
&lt;br&gt;
      &lt;a href="https://github.com/abbasmir12/aether-canvas/agent_assets/sample-files/" rel="noopener noreferrer"&gt;&lt;br&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fabbasmir12%2Faether-canvas%2FHEAD%2Fdocs%2Fmedia%2Fworkflow-files-handdrawn.webp" alt="Hand-drawn collection of ordinary travel files" width="100%"&gt;&lt;br&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;div class="markdown-heading"&gt;

&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abbasmir12/aether-canvas/agent_assets/sample-files/" rel="noopener noreferrer"&gt;01 · Start with files&lt;/a&gt;&lt;/h3&gt;


&lt;/div&gt;
&lt;br&gt;
      &lt;p&gt;Open the exact sample files used in the demo.&lt;/p&gt;
&lt;br&gt;
    &lt;/td&gt;

    &lt;td width="33%"&gt;
&lt;br&gt;
      &lt;a href="https://github.com/abbasmir12/aether-canvas/docs/architecture.md#primary-data-flow" rel="noopener noreferrer"&gt;&lt;br&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fabbasmir12%2Faether-canvas%2FHEAD%2Fdocs%2Fmedia%2Fworkflow-understand-handdrawn.webp" alt="Hand-drawn semantic streams emerging from GPT-5.6 understanding" width="100%"&gt;&lt;br&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;div class="markdown-heading"&gt;

&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abbasmir12/aether-canvas/docs/architecture.md#primary-data-flow" rel="noopener noreferrer"&gt;02 · Understand context&lt;/a&gt;&lt;/h3&gt;


&lt;/div&gt;
&lt;br&gt;
      &lt;p&gt;Follow the implemented GPT-5.6 data flow.&lt;/p&gt;
&lt;br&gt;
    &lt;/td&gt;

    &lt;td width="33%"&gt;
&lt;br&gt;
      &lt;a href="https://github.com/abbasmir12/aether-canvas#see-aether-in-action" rel="noopener noreferrer"&gt;&lt;br&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fabbasmir12%2Faether-canvas%2FHEAD%2Fdocs%2Fmedia%2Fworkflow-workspace-handdrawn.webp" alt="Hand-drawn living workspace with route, budget, packing, map, sync, and answer modules" width="100%"&gt;&lt;br&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;div class="markdown-heading"&gt;

&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abbasmir12/aether-canvas#see-aether-in-action" rel="noopener noreferrer"&gt;03 · Become useful&lt;/a&gt;&lt;/h3&gt;


&lt;/div&gt;
&lt;br&gt;
      &lt;p&gt;See…&lt;/p&gt;
&lt;br&gt;
&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/abbasmir12/aether-canvas" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





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

&lt;h3&gt;
  
  
  The input surface is a blank canvas
&lt;/h3&gt;


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  &lt;blockquote&gt;
&lt;p&gt;There is no import wizard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;/div&gt;


&lt;div class="ltag-col ltag-col-span-2"&gt;
  &lt;p&gt;No project setup, no schema to define, no tagging step, no folder structure to mirror. You drag files onto empty space and put them where they feel like they belong. That gesture is the only configuration the app asks for.&lt;/p&gt;

&lt;/div&gt;



&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;  &lt;span class="ltag-quote__identity"&gt; &lt;span class="ltag-quote__author"&gt;The core design decision&lt;/span&gt; &lt;/span&gt;  &lt;blockquote class="ltag-quote__body"&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
Position is information. When you put two files side by side, you mean something by it. Every tool I've used throws that signal away the moment you close the window.&lt;br&gt; &lt;/div&gt; &lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Five stages, not one prompt
&lt;/h3&gt;

&lt;p&gt;I didn't want this to feel like "point an LLM at a folder and get a summary." So I split the work the way you'd actually split it.&lt;/p&gt;


&lt;div class="ltag-features"&gt;
  &lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;01 — The Drop&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;Files land on an infinite canvas. Any format, any arrangement, no setup.&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;02 — The Read&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;GPT-5.6 extracts what each file actually contains. Not filenames, not metadata. The claims, figures, dates, and entities inside.&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;03 — The Relate&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;Cross-format relationship discovery. A date in a PDF resolving a blank cell in a spreadsheet. A name tying a paragraph to a row.&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;04 — The Render&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;The workspace view is derived, not templated. Trip, knowledge map, or operational board — whichever the content actually supports.&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;05 — The Answer&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;Query the whole workspace at once. Every response carries the file and location it came from.&lt;/p&gt;


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



&lt;/div&gt;





&lt;h3&gt;
  
  
  The hard part was not the canvas
&lt;/h3&gt;


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  &lt;p&gt;My first version linked anything that shared a keyword.&lt;/p&gt;

&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  &lt;p&gt;Every node connected to every other node.&lt;/p&gt;

&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  &lt;p&gt;Technically correct. Completely useless.&lt;/p&gt;

&lt;/div&gt;



&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;  &lt;span class="ltag-quote__identity"&gt; &lt;span class="ltag-quote__author"&gt;The relationship principle&lt;/span&gt; &lt;/span&gt;  &lt;blockquote class="ltag-quote__body"&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
The real problem is deciding when two files are actually related versus merely similar. That distinction is the entire difference between a workspace and a hairball.&lt;br&gt; &lt;/div&gt; &lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;

&lt;p&gt;What worked was making the model justify each edge before it could draw one. A relationship has to name the specific thing it's built on, this date, this figure, this entity, and that evidence has to resolve to a location in both files. If it can't point at both ends, the edge doesn't exist.&lt;/p&gt;

&lt;p&gt;Similarity alone was demoted to a weak signal that affects layout suggestions but never draws a line. Shared topic is not a relationship. Two papers about the same subject that never touch each other's claims are just two papers.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  The rules the relationship engine runs on
  &lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"An edge must cite a specific shared element and resolve it to a location in both source files. Thematic overlap is not sufficient."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Never infer a fact that appears in neither document in order to justify a connection."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Contradiction is a first-class relationship. Two sources disagreeing is more useful than two sources agreeing, and must never be collapsed into consensus."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Confidence must be surfaced, not hidden. A weak edge is drawn weakly or not at all — never drawn as certain."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Spatial proximity raises the prior on a relationship. It never creates one on its own."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;



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




&lt;h3&gt;
  
  
  Same app, three different workspaces
&lt;/h3&gt;


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  &lt;h4&gt;
  
  
  A travel folder
&lt;/h4&gt;

&lt;p&gt;Boarding passes, a hotel confirmation, a messy notes file, a budget sheet. Dates reconciled across all four, costs rolled up, each location linked back to the document that confirmed it. Ask what's actually booked versus still tentative.&lt;/p&gt;

&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  &lt;h4&gt;
  
  
  Research material
&lt;/h4&gt;

&lt;p&gt;Twenty papers, three sets of notes, a screenshot of a diagram you can no longer place. Where the authors agree, where they contradict each other, which claim came from which page. Ask which of them disagree on methodology.&lt;/p&gt;

&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  &lt;h4&gt;
  
  
  Project documents
&lt;/h4&gt;

&lt;p&gt;Specs, a status deck, an email thread, a tracker. The actual state of the project rendered as a view instead of a directory listing that tells you nothing. Ask what's blocked and who owns it.&lt;/p&gt;

&lt;/div&gt;



&lt;/div&gt;





&lt;h3&gt;
  
  
  Local-first, and that shaped everything
&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;  &lt;span class="ltag-quote__identity"&gt; &lt;span class="ltag-quote__author"&gt;The constraint I'm most glad I kept&lt;/span&gt; &lt;/span&gt;  &lt;blockquote class="ltag-quote__body"&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
Nothing about your workspace is stored on my infrastructure, because there is no infrastructure.&lt;br&gt; &lt;/div&gt; &lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;

&lt;p&gt;The canvas state, the extracted content, the relationship graph, and the generated views are all written to local storage on your machine. Electron with React and TypeScript for the shell, React Flow for the canvas, Codex for the build loop.&lt;/p&gt;

&lt;p&gt;That constraint made a few decisions for me. Indexing has to be incremental, because there's no cluster to brute-force a re-scan. The graph has to be cheap to hold in memory. And every answer has to cite a local file path, which turned out to be the feature people trust most.&lt;/p&gt;


&lt;div class="ltag-features"&gt;
  &lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;No upload step&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;Files are read where they already are.&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;No server-side index&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;The graph lives next to your files.&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;Traceable by default&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;Every answer resolves to a path and a location inside it.&lt;/p&gt;


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



&lt;/div&gt;





&lt;h2&gt;
  
  
  What I Want To Know
&lt;/h2&gt;


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  &lt;h3&gt;
  
  
  Does it hold at scale
&lt;/h3&gt;

&lt;p&gt;I'm not convinced folders are the ceiling of how we work with our own information. I'm also not convinced a canvas is the answer — it might just be a prettier mess once you pass a few hundred files.&lt;/p&gt;

&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  &lt;h3&gt;
  
  
  Where would you break it
&lt;/h3&gt;

&lt;p&gt;The most useful comment isn't "cool project." It's the file collection you think would turn this into an unreadable web of edges. Tell me what you'd drop on it first, and where you think it falls apart.&lt;/p&gt;

&lt;/div&gt;



&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;I'd genuinely value the feedback, I've been staring at this thing alone for long enough that I've stopped being able to see it clearly. Tell me what's wrong with it in the comments, and if you try the build, tell me what broke.&lt;br&gt;
And if you think the idea is actually worth something, star ⭐ the repo. That's the honest signal, and it's the thing that decides whether this stays a Build Week project or becomes something I keep going.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;/p&gt;  &lt;span class="ltag-quote__identity"&gt; &lt;span class="ltag-quote__author"&gt;Aether Canvas&lt;/span&gt; &lt;span class="ltag-quote__role"&gt;v1.0.0 · Windows x64 · local-first&lt;/span&gt; &lt;/span&gt;  &lt;blockquote class="ltag-quote__body"&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
Drop your files in. See what they were trying to tell you.&lt;br&gt; &lt;/div&gt; &lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/abbasmir12/aether-canvas/releases/download/v1.0.0/Aether-Canvas-Setup-1.0.0-x64.exe" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Download Aether Canvas for Windows&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Source, architecture notes, and issues → &lt;strong&gt;&lt;a href="https://github.com/abbasmir12/aether-canvas" rel="noopener noreferrer"&gt;github.com/abbasmir12/aether-canvas&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>ai</category>
      <category>openai</category>
    </item>
    <item>
      <title>One More Year -&gt; The Documentary I Never Filmed</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Sun, 12 Jul 2026 19:58:49 +0000</pubDate>
      <link>https://dev.to/mirshah12/one-more-year-the-documentary-i-never-filmed-1phb</link>
      <guid>https://dev.to/mirshah12/one-more-year-the-documentary-i-never-filmed-1phb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  One More Year
&lt;/h1&gt;

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


&lt;div class="ltag-quote"&gt; &lt;div class="ltag-quote__body"&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--start"&gt;  &lt;/div&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
I built a documentary studio.&lt;br&gt; &lt;/div&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--end"&gt;  &lt;/div&gt; &lt;/div&gt;   &lt;div class="ltag-quote__author-info"&gt; &lt;div class="ltag-quote__meta"&gt; &lt;span class="ltag-quote__author"&gt;One More Year&lt;/span&gt; &lt;span class="ltag-quote__role"&gt;An AI documentary studio&lt;/span&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;

&lt;p&gt;Not a template with your name dropped in. An actual small production pipeline that reads four things you tell it, decides what your story is, casts it with real performed voices, builds its own sound design, writes its own score, and prints a real mp4. All in the browser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's the observation it started from. Everyone has one thing they can't quit. Football, chess, a piano someone left them, a side project nobody asked for. And almost none of that ever becomes anything, because turning "the thing I can't stop doing" into something that actually feels like a documentary normally takes a camera crew, actors, a sound engineer, and about a week of editing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I tried to compress that whole crew into five automated desks and see how close I could get.&lt;/p&gt;


&lt;div class="ltag-offer"&gt;
  &lt;div class="ltag-offer__body"&gt;
&lt;br&gt;
It's called &lt;strong&gt;One More Year&lt;/strong&gt;. You answer four questions. It gives you back a short film with a narrator, you as the subject, and a couple of extra voices pulled from inside your own story: memory, doubt, whatever the piece needs. Every voice is performed, not read. Every sound effect is chosen for that scene. Every score is composed fresh. It's all mixed and encoded into a real video file without a render server ever touching it.&lt;br&gt;
&lt;/div&gt;
&lt;/div&gt;





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

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

&lt;p&gt;&lt;/p&gt;
  Why there is no hosted public demo
  &lt;p&gt;There's no hosted public demo. That's on purpose.&lt;/p&gt;

&lt;p&gt;The ElevenLabs key is kept server-side only, so it never reaches browser JavaScript. Hosting it publicly would mean putting my own paid key on the open internet for strangers to spend. So instead, the whole thing runs locally in about two minutes, with your own free Gemini key and your own ElevenLabs key.&lt;/p&gt;



&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/abbasmir12/onemoreyear
&lt;span class="nb"&gt;cd &lt;/span&gt;onemoreyear
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Open the Press Room, drop in a key, hit Start Your Story. Headphones on.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Code
&lt;/h2&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/abbasmir12" rel="noopener noreferrer"&gt;
        abbasmir12
      &lt;/a&gt; / &lt;a href="https://github.com/abbasmir12/onemoreyear" rel="noopener noreferrer"&gt;
        onemoreyear
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An Open Source documentary studio for the things you cannot quit - directed by Gemini, performed by ElevenLabs
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ᴏɴᴇ ᴍᴏʀᴇ ʏᴇᴀʀ&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;An open-source documentary studio for the thing you cannot quit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to" rel="nofollow"&gt;DEV Weekend Challenge: Passion Edition&lt;/a&gt; — July 10–13, 2026&lt;/em&gt;&lt;/p&gt;


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

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/abbasmir12/onemoreyear/docs/hero.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fabbasmir12%2Fonemoreyear%2FHEAD%2Fdocs%2Fhero.png" alt="One More Year — Everyone has one thing they can't quit." width="100%"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;Everyone has one thing they can't quit.&lt;/p&gt;
&lt;p&gt;Most tools would ask you to write it down. This one asks you to say it out loud — then hands it to a director, a cast, a sound desk, and a print desk, and gets you back a real short film.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it actually does&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;You answer four questions. Nothing technical — just &lt;em&gt;what's the thing you can't quit, when did it almost end, why did you stay,&lt;/em&gt; and &lt;em&gt;one line only you would say.&lt;/em&gt; That's the entire brief.&lt;/p&gt;

&lt;p&gt;From there, a real production pipeline runs — not a template filled in, not a single flat voice reading a script. An AI director reads what you gave it, decides what the story actually is, and hands it…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/abbasmir12/onemoreyear" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





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

&lt;h3&gt;
  
  
  The four questions
&lt;/h3&gt;


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  


&lt;blockquote&gt;
&lt;p&gt;The input surface is deliberately tiny.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;/div&gt;


&lt;div class="ltag-col ltag-col-span-2"&gt;
  


&lt;p&gt;What's the thing you can't quit. When did it almost end. Why did you stay. One line only you would say. No writing, no script, no timeline editor.&lt;/p&gt;




&lt;/div&gt;



&lt;/div&gt;



&lt;div class="ltag-quote"&gt; &lt;div class="ltag-quote__body"&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--start"&gt;  &lt;/div&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
That constraint is the actual design decision. Asking someone to write a story gets you a self-conscious kind of writing. Asking them a direct question at 2am gets you something else entirely.&lt;br&gt; &lt;/div&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--end"&gt;  &lt;/div&gt; &lt;/div&gt;   &lt;div class="ltag-quote__author-info"&gt; &lt;div class="ltag-quote__meta"&gt; &lt;span class="ltag-quote__author"&gt;The core design decision&lt;/span&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;


&lt;h3&gt;
  
  
  Five desks, not one prompt
&lt;/h3&gt;

&lt;p&gt;I didn't want this to feel like "type something, get an AI blob back." So I split the work the way a real production would split it.&lt;/p&gt;


&lt;div class="ltag-features"&gt;
  &lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;01 — The Interview&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
Four questions. No writing required.&lt;br&gt;&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;02 — The Director&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
Gemini reads your answers, finds the arc, and writes a full script. It casts a narrator, you, and one or two symbolic voices pulled from inside the story itself.&lt;br&gt;&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;03 — The Cast&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
Every voice is performed through ElevenLabs eleven_v3. Hesitations, corrections, a line that actually breaks where it should.&lt;br&gt;&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;04 — Sound &amp;amp;amp; Score&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
The director decides what a scene needs, generates that exact effect, then composes an original score through ElevenLabs Music v2.&lt;br&gt;&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;05 — The Print&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
ffmpeg.wasm mixes every voice, effect, and cue against the frames and encodes a real mp4. Client-side. No render server.&lt;br&gt;&lt;/p&gt;


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



&lt;/div&gt;





&lt;h3&gt;
  
  
  The director doesn't summarize. It directs.
&lt;/h3&gt;


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  


&lt;p&gt;My first version of the prompt just asked Gemini to turn the answers into a short documentary.&lt;/p&gt;




&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  


&lt;p&gt;What came back read like a summary with quotation marks around it.&lt;/p&gt;




&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  


&lt;p&gt;Competent. Flat. Forgettable.&lt;/p&gt;




&lt;/div&gt;



&lt;/div&gt;



&lt;div class="ltag-quote"&gt; &lt;div class="ltag-quote__body"&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--start"&gt;  &lt;/div&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
What worked instead was telling it to behave like a documentary editor. Find the arc, not the facts.&lt;br&gt; &lt;/div&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--end"&gt;  &lt;/div&gt; &lt;/div&gt;   &lt;div class="ltag-quote__author-info"&gt; &lt;div class="ltag-quote__meta"&gt; &lt;span class="ltag-quote__author"&gt;The directing principle&lt;/span&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;

&lt;p&gt;Cast a narrator and the subject, then add one or two symbolic voices, like memory or doubt. Those voices are explicitly not allowed to invent facts or pretend to be real witnesses.&lt;/p&gt;

&lt;p&gt;Write two versions of every line. A clean transcript, and a separate performance string with sparse, motivated imperfections: a repeated word, a false start, a line that catches. Most lines stay clean, so the handful of imperfect moments actually mean something.&lt;/p&gt;

&lt;p&gt;Every scene also gets a director-chosen transition. Direct, sound, or silence. The first scene is mandatory sound, because a documentary that opens on a voice mid-sentence with nothing behind it doesn't feel like one.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Read the actual rules I gave the AI director
  &lt;p&gt;A few of the real constraints from the production prompt, word for word:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Symbolic voices are fragments of the subject's interior story, not factual witnesses. They must never claim to be a coach, friend, rival, family member, or person who was present."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Never invent a quote, date, injury, achievement, relationship, or event the person did not provide."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Human speech is not polished prose. In only 2 or 3 segments across the entire film, add ONE motivated imperfection. Never sprinkle random 'um' sounds everywhere."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Segment 1 MUST use 'sound' for 4–5 seconds before anyone speaks. Establish the physical world first."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Every film gets a score. If the story calls for restraint, choose 'instrumental' and keep it sparse, rather than skipping the score entirely."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;



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




&lt;h3&gt;
  
  
  The cast, the room tone, the score
&lt;/h3&gt;


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  


&lt;h4&gt;
  
  
  The Cast
&lt;/h4&gt;

&lt;p&gt;Every performed line goes through eleven_v3.&lt;/p&gt;




&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  


&lt;h4&gt;
  
  
  The Room Tone
&lt;/h4&gt;

&lt;p&gt;Every scene's ambience, a stadium, a stairwell, rain on a tin roof, is a real generated sound effect chosen for that specific beat. Not a stock loop reused everywhere.&lt;/p&gt;




&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  


&lt;h4&gt;
  
  
  The Score
&lt;/h4&gt;

&lt;p&gt;Every film also gets an original score through Music v2. The director can choose instrumental, vocal, or hybrid, but never nothing. A quiet story doesn't mean a silent one. It means a sparser score, not an empty desk.&lt;/p&gt;




&lt;/div&gt;



&lt;/div&gt;





&lt;h3&gt;
  
  
  Printed with ffmpeg, not on a server
&lt;/h3&gt;


&lt;div class="ltag-quote"&gt; &lt;div class="ltag-quote__body"&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--start"&gt;  &lt;/div&gt; &lt;div class="ltag-quote__text"&gt;
&lt;br&gt;
This is the part I'm most proud of.&lt;br&gt; &lt;/div&gt; &lt;div class="ltag-quote__mark ltag-quote__mark--end"&gt;  &lt;/div&gt; &lt;/div&gt;   &lt;div class="ltag-quote__author-info"&gt; &lt;div class="ltag-quote__meta"&gt; &lt;span class="ltag-quote__author"&gt;The part I'm most proud of&lt;/span&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;

&lt;p&gt;The final assembly happens with ffmpeg compiled to WebAssembly, running client-side. Timing every voice line against its lead-in. Layering sound effects at the right offsets. Ducking the score under dialogue. Encoding the whole thing to H.264.&lt;/p&gt;


&lt;div class="ltag-features"&gt;
  &lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;No render queue&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
No render queue.&lt;br&gt;&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;No upload and wait&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
No upload and wait.&lt;br&gt;&lt;/p&gt;


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


&lt;div class="ltag-feature"&gt;
  &lt;div class="ltag-feature__content"&gt;
    &lt;div class="ltag-feature__title"&gt;A real downloadable file&lt;/div&gt;
    &lt;div class="ltag-feature__body"&gt;

      &lt;p&gt;&lt;br&gt;&lt;br&gt;
The browser does the actual video engineering and hands you back a downloadable file.&lt;br&gt;&lt;/p&gt;


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



&lt;/div&gt;





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


&lt;div class="ltag-row"&gt;
  &lt;div class="ltag-col"&gt;
  


&lt;h3&gt;
  
  
  Best Use of Google AI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Google AI.&lt;/strong&gt; Gemini directs the entire piece: structured JSON output for the script and cast, image generation for the frames.&lt;/p&gt;




&lt;/div&gt;


&lt;div class="ltag-col"&gt;
  


&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best Use of ElevenLabs.&lt;/strong&gt; Every voice, every sound effect, and every score in the film is generated live through eleven_v3, the Sound Effects API, and Music v2.&lt;/p&gt;




&lt;/div&gt;



&lt;/div&gt;





&lt;p&gt;&lt;a href="https://github.com/abbasmir12/onemoreyear" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;https://github.com/abbasmir12/onemoreyear&lt;/a&gt;
&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>discuss</category>
    </item>
    <item>
      <title>ORVIX, Open-source Self-Organizing AI Engineering Company</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Tue, 07 Jul 2026 14:12:06 +0000</pubDate>
      <link>https://dev.to/mirshah12/orvix-open-source-self-organizing-ai-engineering-company-4cd1</link>
      <guid>https://dev.to/mirshah12/orvix-open-source-self-organizing-ai-engineering-company-4cd1</guid>
      <description>&lt;h1&gt;
  
  
  I Built an Open-Source AI Engineering Company Instead of Another AI Agent
&lt;/h1&gt;

&lt;p&gt;For the past year, AI coding agents have become incredibly capable.&lt;/p&gt;

&lt;p&gt;But almost all of them still follow the same idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One increasingly capable AI should build everything.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted to explore the opposite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the AI wasn't the engineer? What if it became the entire engineering company?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's how &lt;strong&gt;Orvix&lt;/strong&gt; started.&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet Orvix
&lt;/h2&gt;

&lt;p&gt;Orvix is a self-organizing AI engineering company.&lt;/p&gt;

&lt;p&gt;You don't create agents manually or decide how many are needed.&lt;/p&gt;

&lt;p&gt;You simply describe the mission.&lt;/p&gt;

&lt;p&gt;From there, Orvix designs the project, creates exactly the specialists required for that mission, assigns ownership, coordinates their work, reviews their pull requests, and even creates entirely new specialists later if the project grows.&lt;/p&gt;

&lt;p&gt;Every mission creates a different engineering company.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building software like a real engineering team
&lt;/h2&gt;

&lt;p&gt;Instead of one AI jumping between frontend, backend, infrastructure, testing and documentation, Orvix treats them as independent engineers.&lt;/p&gt;

&lt;p&gt;Each specialist owns its own Git branch.&lt;/p&gt;

&lt;p&gt;They work in parallel.&lt;/p&gt;

&lt;p&gt;They negotiate decisions.&lt;/p&gt;

&lt;p&gt;They review one another's work.&lt;/p&gt;

&lt;p&gt;They communicate through the &lt;strong&gt;Orvix Book&lt;/strong&gt;, a shared communication layer where engineers ask questions, request clarification, share discoveries, and coordinate their work instead of sharing one giant conversation.&lt;/p&gt;

&lt;p&gt;The goal isn't just generating code.&lt;/p&gt;

&lt;p&gt;It's organizing engineering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Local first. Cloud when you need it.
&lt;/h2&gt;

&lt;p&gt;One thing I wanted from the beginning was flexibility.&lt;/p&gt;

&lt;p&gt;Orvix can run completely on your own machine if you want everything local.&lt;/p&gt;

&lt;p&gt;Or you can deploy the Orvix runtime on &lt;strong&gt;Alibaba Cloud ECS&lt;/strong&gt;, allowing anyone on your team to connect to the same engineering company remotely while every mission, every specialist, and the entire execution live on the server.&lt;/p&gt;

&lt;p&gt;For this hackathon, Orvix was deployed on Alibaba Cloud and powered by &lt;strong&gt;Qwen Cloud (Alibaba Cloud Model Studio)&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  There's much more behind it
&lt;/h2&gt;

&lt;p&gt;This post only scratches the surface.&lt;/p&gt;

&lt;p&gt;The repository includes detailed documentation covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the complete architecture&lt;/li&gt;
&lt;li&gt;the Orvix Map&lt;/li&gt;
&lt;li&gt;the Orvix Book&lt;/li&gt;
&lt;li&gt;the planning pipeline&lt;/li&gt;
&lt;li&gt;dynamic specialist creation&lt;/li&gt;
&lt;li&gt;mission lifecycle&lt;/li&gt;
&lt;li&gt;deployment on Alibaba Cloud&lt;/li&gt;
&lt;li&gt;and the reasoning behind the system's design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're curious about how an AI engineering company actually works, I'd love for you to take a look.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/abbasmir12/orvix/tree/main/docs" rel="noopener noreferrer"&gt;https://github.com/abbasmir12/orvix/tree/main/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/ZzocAW0nbTs" rel="noopener noreferrer"&gt;https://youtu.be/ZzocAW0nbTs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I'd love to hear what you think. If you have ideas for improving Orvix or thoughts about multi-agent engineering systems, feel free to share them.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Among Liars -&gt; The 7th Player Isn't Human</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Sat, 20 Jun 2026 11:24:32 +0000</pubDate>
      <link>https://dev.to/mirshah12/among-liars-the-7th-player-isnt-human-345h</link>
      <guid>https://dev.to/mirshah12/among-liars-the-7th-player-isnt-human-345h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/june-game-jam-2026-06-03"&gt;June Solstice Game Jam&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Among Liars&lt;/strong&gt;, a realtime multiplayer elimination where six humans join a room, but the game secretly adds a seventh player: a &lt;strong&gt;Gemini-powered AI&lt;/strong&gt; hiding inside the Spy side.&lt;/p&gt;

&lt;p&gt;There are two teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detectives&lt;/strong&gt; are trying to expose the hidden AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spies&lt;/strong&gt; are trying to protect the AI long enough for the Detectives to run out of chances.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The game is inspired by the &lt;strong&gt;Turing Test&lt;/strong&gt;, but instead of asking &lt;em&gt;"Can AI answer like a human?"&lt;/em&gt;, it asks something more playable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can AI survive being socially judged by humans?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the game begins, six human players are split into two teams: &lt;strong&gt;three Detectives&lt;/strong&gt; and &lt;strong&gt;three Spy Agents&lt;/strong&gt;. A hidden &lt;strong&gt;Gemini-powered AI&lt;/strong&gt; is then added to the Spy side, creating a team of &lt;strong&gt;four spies&lt;/strong&gt;. The Detectives must identify the AI, while the Spy Agents work together to keep it hidden.&lt;/p&gt;

&lt;p&gt;Each round starts with a &lt;strong&gt;2-minute warmup&lt;/strong&gt; where teams can plan in private rooms. Detectives discuss who feels suspicious. Spies coordinate how to protect the AI.&lt;/p&gt;

&lt;p&gt;Then one Detective asks a wildcard-style question to the Spy side. The question is automatically sent to every living Spy player and also to the Gemini AI. Everyone answers under pressure, and the Detective has to read the answers like evidence.&lt;/p&gt;

&lt;p&gt;The trick is that Spy-side players receive &lt;strong&gt;new cover names every round&lt;/strong&gt;, so Detectives cannot simply track the AI by name or position. They have to judge tone, timing, weirdness, confidence, and emotional detail.&lt;/p&gt;

&lt;p&gt;A question like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Describe a tiny mistake you made today without making it sound important."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;is much harder than a normal trivia question because it asks for texture, not correctness.&lt;/p&gt;

&lt;p&gt;That is where the game becomes interesting.&lt;/p&gt;

&lt;p&gt;Sometimes AI sounds too polished.&lt;/p&gt;

&lt;p&gt;Sometimes humans sound fake on purpose.&lt;/p&gt;

&lt;p&gt;Sometimes the suspicious answer is suspicious because it is AI.&lt;/p&gt;

&lt;p&gt;Sometimes it is suspicious because a Spy is protecting the AI.&lt;/p&gt;

&lt;p&gt;That tension is the core of &lt;strong&gt;Among Liars&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can play it here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://amongliars.vercel.app" rel="noopener noreferrer"&gt;https://amongliars.vercel.app&lt;/a&gt;&lt;/p&gt;




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

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




&lt;h2&gt;
  
  
  Live App
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://amongliars.vercel.app" rel="noopener noreferrer"&gt;https://amongliars.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Repository
&lt;/h2&gt;

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

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

&lt;p&gt;The frontend is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Framer Motion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and a custom black-and-white visual style.&lt;/p&gt;

&lt;p&gt;The backend uses &lt;strong&gt;Supabase&lt;/strong&gt; for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Room creation&lt;/li&gt;
&lt;li&gt;Random matchmaking&lt;/li&gt;
&lt;li&gt;Player state&lt;/li&gt;
&lt;li&gt;Role assignment&lt;/li&gt;
&lt;li&gt;Realtime chat&lt;/li&gt;
&lt;li&gt;Private team rooms&lt;/li&gt;
&lt;li&gt;Round state&lt;/li&gt;
&lt;li&gt;Answer storage&lt;/li&gt;
&lt;li&gt;Eliminations&lt;/li&gt;
&lt;li&gt;Win conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used &lt;strong&gt;Supabase Realtime&lt;/strong&gt; instead of a custom WebSocket server, so messages, answers, player changes, and round changes update live across browser tabs and devices.&lt;/p&gt;

&lt;p&gt;The game includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6-player waiting room with automatic countdown&lt;/li&gt;
&lt;li&gt;Private role reveal&lt;/li&gt;
&lt;li&gt;Detective-only and Spy-only private rooms&lt;/li&gt;
&lt;li&gt;Public chat&lt;/li&gt;
&lt;li&gt;2-minute planning/warmup phase&lt;/li&gt;
&lt;li&gt;Rotating Spy cover names every round&lt;/li&gt;
&lt;li&gt;Wildcard question flow&lt;/li&gt;
&lt;li&gt;90-second Detective question window&lt;/li&gt;
&lt;li&gt;45-second Spy answer window&lt;/li&gt;
&lt;li&gt;30-second Detective final read window&lt;/li&gt;
&lt;li&gt;Gemini AI answer generation&lt;/li&gt;
&lt;li&gt;Evidence cards&lt;/li&gt;
&lt;li&gt;Detective guess phase&lt;/li&gt;
&lt;li&gt;Round result screen&lt;/li&gt;
&lt;li&gt;Eliminated player tracking&lt;/li&gt;
&lt;li&gt;Detective/Spy win states&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Round Flow
&lt;/h2&gt;

&lt;p&gt;Each round is designed to feel like a small interrogation.&lt;/p&gt;

&lt;p&gt;First, there is a &lt;strong&gt;2-minute warmup&lt;/strong&gt;. During this time everyone can continue talking publicly, but the private rooms are where the real strategy happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detective Strategy Room
&lt;/h3&gt;

&lt;p&gt;Detectives discuss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who sounds too clean&lt;/li&gt;
&lt;li&gt;Who is avoiding pressure&lt;/li&gt;
&lt;li&gt;What question would expose the AI&lt;/li&gt;
&lt;li&gt;Which answer patterns felt suspicious in previous rounds&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Spy Strategy Room
&lt;/h3&gt;

&lt;p&gt;Spies coordinate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to protect the hidden AI&lt;/li&gt;
&lt;li&gt;How messy or natural their answers should feel&lt;/li&gt;
&lt;li&gt;Whether to draw suspicion away from one player&lt;/li&gt;
&lt;li&gt;How to make the room harder for Detectives to read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After warmup, one living Detective is selected.&lt;/p&gt;

&lt;p&gt;That Detective receives a &lt;strong&gt;90-second question window&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Detective writes a wildcard pressure prompt. Once submitted, the question is automatically sent to every living Spy-side player, including the human Spies and the hidden Gemini AI.&lt;/p&gt;

&lt;p&gt;The Spy side then receives a &lt;strong&gt;45-second answer window&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Human Spies type their responses while Gemini generates its answer through a Supabase Edge Function.&lt;/p&gt;

&lt;p&gt;All responses are stored in Supabase and displayed as evidence cards.&lt;/p&gt;

&lt;p&gt;Finally, the selected Detective receives a &lt;strong&gt;30-second final read window&lt;/strong&gt; and must click the answer card they believe belongs to the AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolution
&lt;/h3&gt;

&lt;p&gt;The resolution is intentionally asymmetric:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the Detective guesses wrong, that Detective is eliminated.&lt;/li&gt;
&lt;li&gt;If the Detective guesses correctly, one human Spy bodyguard is eliminated.&lt;/li&gt;
&lt;li&gt;The AI survives until all human Spies are gone and it has nowhere left to hide.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Undercover Names
&lt;/h2&gt;

&lt;p&gt;One of the most important mechanics is the rotating identity system.&lt;/p&gt;

&lt;p&gt;Spy-side players never keep the same visible name between rounds.&lt;/p&gt;

&lt;p&gt;A player might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;TAVI&lt;/code&gt; in Round 1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ORION&lt;/code&gt; in Round 2&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MICA&lt;/code&gt; in Round 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents cheap detective work.&lt;/p&gt;

&lt;p&gt;Detectives cannot simply memorize player names, positions, or patterns tied to a specific identity.&lt;/p&gt;

&lt;p&gt;Instead, they must judge the answers themselves.&lt;/p&gt;

&lt;p&gt;Previous round results preserve the original cover names, so historical evidence remains readable even after identities rotate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wildcard Questions
&lt;/h2&gt;

&lt;p&gt;The wildcard question is the heart of the game.&lt;/p&gt;

&lt;p&gt;The best questions pressure the difference between a lived human answer and a generated answer.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Describe a tiny mistake you made today without making it sound important."&lt;/li&gt;
&lt;li&gt;"What is a smell that makes you trust a place?"&lt;/li&gt;
&lt;li&gt;"Say something you would only text, not say out loud."&lt;/li&gt;
&lt;li&gt;"Which answer in this room feels rehearsed, and why?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions are not about facts.&lt;/p&gt;

&lt;p&gt;They are about texture.&lt;/p&gt;

&lt;p&gt;They force players to produce awkward, emotional, sensory, or social details under pressure.&lt;/p&gt;

&lt;p&gt;That is where the Turing Test becomes playable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini Integration
&lt;/h3&gt;

&lt;p&gt;The Gemini integration runs server-side through a &lt;strong&gt;Supabase Edge Function&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a Detective submits a question, the function:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks the current room and round.&lt;/li&gt;
&lt;li&gt;Finds the hidden AI player.&lt;/li&gt;
&lt;li&gt;Reads the AI's current cover name.&lt;/li&gt;
&lt;li&gt;Sends the question and game context to Gemini.&lt;/li&gt;
&lt;li&gt;Receives a short in-character answer.&lt;/li&gt;
&lt;li&gt;Saves the answer into Supabase.&lt;/li&gt;
&lt;li&gt;Broadcasts it alongside the other Spy answers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Gemini API key is never exposed to the browser.&lt;/p&gt;

&lt;p&gt;I also added multiple AI behavior styles so Gemini does not always respond with the same personality.&lt;/p&gt;

&lt;p&gt;Sometimes it answers plainly.&lt;/p&gt;

&lt;p&gt;Sometimes it is guarded.&lt;/p&gt;

&lt;p&gt;Sometimes it is short, awkward, or oddly direct.&lt;/p&gt;

&lt;p&gt;The goal is not to make the AI sound perfectly human every time.&lt;/p&gt;

&lt;p&gt;The goal is to make it difficult to separate from the Spy side.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;I am submitting for both optional prize categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Ode to Alan Turing
&lt;/h3&gt;

&lt;p&gt;Among Liars is built directly around the idea of the &lt;strong&gt;Turing Test&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But instead of making the test a static question-and-answer screen, I turned it into a social game.&lt;/p&gt;

&lt;p&gt;The AI is not judged by one answer alone.&lt;/p&gt;

&lt;p&gt;It is judged by how it survives inside a room full of humans who are actively suspicious of it.&lt;/p&gt;

&lt;p&gt;The game asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a machine imitate a human well enough to survive pressure, suspicion, and social reading?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That felt like a more interactive tribute to Alan Turing's original imitation game.&lt;/p&gt;




&lt;h3&gt;
  
  
  Best Google AI Usage
&lt;/h3&gt;

&lt;p&gt;Gemini is not a decorative feature in this project.&lt;/p&gt;

&lt;p&gt;It is the hidden player.&lt;/p&gt;

&lt;p&gt;The entire game loop depends on Gemini:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemini receives the Detective's wildcard question.&lt;/li&gt;
&lt;li&gt;Gemini answers as a Spy-side player.&lt;/li&gt;
&lt;li&gt;Gemini uses the current room context and cover name.&lt;/li&gt;
&lt;li&gt;Gemini's answer becomes evidence the Detective must judge.&lt;/li&gt;
&lt;li&gt;The game cannot fully exist without the AI participant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I integrated Gemini through a server-side Supabase Edge Function so the API key remains protected and the AI response becomes part of the realtime game state.&lt;/p&gt;

&lt;p&gt;The AI is also given its current undercover identity and round context, allowing it to behave like a player inside the match rather than a generic assistant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Among Liars started from a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if the Turing Test was not a test, but a game night?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The result is a tense social deduction game where humans are reading AI, humans are imitating AI, and nobody can fully trust what "normal" sounds like.&lt;/p&gt;

&lt;p&gt;That is the fun part.&lt;/p&gt;

&lt;p&gt;In this game, the AI does not need to be perfect.&lt;/p&gt;

&lt;p&gt;It just needs to survive.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gamechallenge</category>
      <category>gamedev</category>
      <category>amongliars</category>
    </item>
    <item>
      <title>PROCSee -&gt; Turn Your System Into a Crime Scene &amp; let Gemini Become Investigator!</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Thu, 26 Feb 2026 15:10:50 +0000</pubDate>
      <link>https://dev.to/mirshah12/procsee-turn-your-system-into-a-crime-scene-let-gemini-become-investigator-hbc</link>
      <guid>https://dev.to/mirshah12/procsee-turn-your-system-into-a-crime-scene-let-gemini-become-investigator-hbc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;About four weeks ago, the &lt;a href="https://gemini3.devpost.com/" rel="noopener noreferrer"&gt;Gemini 3 Hackathon&lt;/a&gt; dropped — Google DeepMind's global hackathon with a $100K prize pool, asking builders to create something genuinely new with the Gemini 3 API. Not another chatbot. Not a wrapper. Something that actually pushes what the model can do.&lt;/p&gt;

&lt;p&gt;I had one question sitting in my head for a while: &lt;em&gt;what if your computer could investigate itself?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Not just flag a suspicious process. Not just match a signature and throw an alert at you. But actually &lt;em&gt;think&lt;/em&gt; — form a theory, pull more evidence, change its mind, reach a conclusion. The way a real security analyst would.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;PROCSee&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's an autonomous security investigation system for Windows. It monitors every process on your machine in real-time, and when something looks suspicious, it hands the investigation off to Gemini 3 Pro — which then decides what additional data it needs, queries for it, reasons across multiple rounds of evidence, and writes a full forensic report. The tagline: &lt;em&gt;Turn your system into a crime scene. Let PROCSee be the forensic analyst.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  How It Actually Works (The Architecture)
&lt;/h3&gt;

&lt;p&gt;Let me walk through this the way I wish someone had explained it to me before I built it, because the architecture decisions were the hardest part — not the AI integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Catch everything, instantly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Windows is constantly spawning processes. Updaters, scanners, system services — hundreds of events per hour on a normal machine. The classic approach is polling: check what's running every few seconds. The problem? A piece of malware that executes, drops a payload, and exits in under a second is completely invisible to a poller.&lt;/p&gt;

&lt;p&gt;We used &lt;strong&gt;WMI event callbacks&lt;/strong&gt; instead. WMI (Windows Management Instrumentation) is a pub/sub system built into Windows. You subscribe to process creation events, and the OS calls your code the moment &lt;em&gt;anything&lt;/em&gt; starts — under 10ms latency. We capture it all: the process name, path, parent process, command line, user account, everything. Immediately written to a &lt;strong&gt;raw events database&lt;/strong&gt; in SQLite. No analysis yet. Just capture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New Process Starts
      ↓
WMI fires callback (&amp;lt;10ms)
      ↓
Stored in raw_process_events immediately
      ↓
Done. Fast. No AI involved yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: The problem with "just send everything to Gemini"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's where we made our first big mistake, and then fixed it.&lt;/p&gt;

&lt;p&gt;Our first instinct: every time a process starts, send its data to Gemini and ask "is this suspicious?" Simple idea. We tested it. On a normal Windows machine, that's easily 3-5 process creation events per second during active use. At that rate you'd blow through your API quota in literal &lt;em&gt;minutes&lt;/em&gt;. Not hours. Minutes.&lt;/p&gt;

&lt;p&gt;So we needed a smarter funnel before anything touches the API.&lt;/p&gt;

&lt;p&gt;We built a &lt;strong&gt;local behavior-scoring engine&lt;/strong&gt; — zero API cost, runs entirely on-device. It checks 40+ patterns before Gemini ever sees anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is PowerShell using &lt;code&gt;-encodedcommand&lt;/code&gt; or &lt;code&gt;-executionpolicy bypass&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Is a browser spawning a shell? (chrome.exe → powershell.exe is almost never legitimate)&lt;/li&gt;
&lt;li&gt;Is something executing from &lt;code&gt;%TEMP%&lt;/code&gt; or &lt;code&gt;AppData&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Is &lt;code&gt;certutil.exe&lt;/code&gt; or &lt;code&gt;mshta.exe&lt;/code&gt; making network connections? (classic LOLBins abuse)&lt;/li&gt;
&lt;li&gt;Is a process touching registry persistence keys?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each pattern scores points. If a process scores zero — nothing suspicious — it's logged and forgotten. It never reaches Gemini. Only things that &lt;em&gt;earn&lt;/em&gt; attention get elevated. This alone cut our API calls by around 95%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: The dual-database architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even with the scoring filter, we still needed to solve &lt;em&gt;what&lt;/em&gt; Gemini actually sees. This is the core architectural insight of the whole project: &lt;strong&gt;separate "store everything" from "show the AI what matters."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We run two databases side by side:&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;raw events database&lt;/strong&gt; stores every single process event in full detail. This is the forensic record — complete, unfiltered, queryable at any time. It's how we can answer "show me every process that made a network connection to this external IP in the last 30 minutes" without having pre-loaded all of that into Gemini's context.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;summary database&lt;/strong&gt; gets built every 60 seconds. We aggregate the raw events into a 1-minute digest: what was unusual, what matched suspicious patterns, the high-level picture. This is small — a few KB of actual signal. This is what Gemini reads first to orient itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw Events DB (everything)  →→→  Summary DB (1-min digest)
       ↓                                    ↓
  Forensic record                   Gemini reads this first
  Gemini queries this               to orient itself
  when it needs more detail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Gemini doesn't just read the data — it decides what it needs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the part we're most proud of, and it's what makes PROCSee different from a standard AI integration.&lt;/p&gt;

&lt;p&gt;Most AI integrations work like this: gather all the data you think is relevant, stuff it into a prompt, hope the AI has what it needs. The problem is you're guessing what it'll need. You either over-send (burns tokens, hits context limits) or under-send (bad analysis).&lt;/p&gt;

&lt;p&gt;We flipped it. After Gemini reads the summary, it can say: "I need more information before I give you a verdict." And then it tells us exactly what it wants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"needs_more_data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"QUERY_PROCESS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"process_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4821&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"time_range"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"last_5_minutes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"details"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file_access"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cpu"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"QUERY_NETWORK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"time_range"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"last_30_minutes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"min_connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We execute those queries against the raw database, return the results, and Gemini continues its analysis. Another round. It keeps doing this until it's confident enough to give a verdict.&lt;/p&gt;

&lt;p&gt;A real investigation flow looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Round 1&lt;/strong&gt; — Gemini reads the summary: &lt;em&gt;"There's suspicious PowerShell activity worth investigating."&lt;/em&gt;&lt;br&gt;
→ We query: full process details for that PowerShell instance&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round 2&lt;/strong&gt; — Gemini gets the data: &lt;em&gt;"It's making outbound connections to 203.0.113.42, an external IP."&lt;/em&gt;&lt;br&gt;
→ We query: all network activity to that IP across the whole system&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round 3&lt;/strong&gt; — Gemini gets the data: &lt;em&gt;"Three separate processes are all calling out to the same external IP. This is command-and-control communication."&lt;/em&gt;&lt;br&gt;
→ &lt;strong&gt;Final verdict: CONFIRMED_THREAT — risk 0.95, confidence 0.92&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No human in that loop. Gemini decided what it needed, went and got it, and formed its own conclusion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: The forensic report&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When risk is ≥50% and confidence is ≥60%, Gemini generates a full Markdown forensic report — written in first person, walking through its investigation process, the evidence chain, MITRE ATT&amp;amp;CK technique mappings, indicators of compromise, and recommended response actions.&lt;/p&gt;

&lt;p&gt;We built a custom renderer for these reports with syntax highlighting for &lt;code&gt;cmd:&lt;/code&gt;, &lt;code&gt;path:&lt;/code&gt;, &lt;code&gt;ip:&lt;/code&gt;, and &lt;code&gt;proc:&lt;/code&gt; prefixes so they read like real analyst documents, not raw AI output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt; Python + FastAPI for the backend agent, SQLite with WAL mode for the dual-database architecture, pywin32 for WMI, psutil for process data, React + Vite for the dashboard, WebSocket for real-time streaming, and the &lt;code&gt;google-genai&lt;/code&gt; SDK for Gemini 3 Pro.&lt;/p&gt;




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

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[GitHub: &lt;a href="https://github.com/abbasmir12/procsee" rel="noopener noreferrer"&gt;https://github.com/abbasmir12/procsee&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The dashboard has a few views worth calling out. The &lt;strong&gt;Gemini Conversation View&lt;/strong&gt; is the one that surprised me most when I first saw it working. You can watch in real-time as Gemini issues a &lt;code&gt;QUERY_NETWORK&lt;/code&gt; call, gets results back, immediately pivots to &lt;code&gt;QUERY_PATTERN: shell_spawn&lt;/code&gt; because it noticed something in the results, and keeps iterating toward a verdict. It genuinely looks like watching someone think through a problem — because that's what it is.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Detailed Report Viewer&lt;/strong&gt; renders the final forensic reports with full Markdown and syntax highlighting. Each report includes the complete investigation chain — every query Gemini issued, every piece of evidence it weighed, every confidence score.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  The architecture problem was the real challenge
&lt;/h3&gt;

&lt;p&gt;Here's what I didn't expect going in: the Gemini integration itself was actually the smooth part. Once the architecture was solid, plugging in Gemini was relatively clean. The hard part — the part that took most of the time — was building the system that makes &lt;em&gt;responsible, efficient use&lt;/em&gt; of the API.&lt;/p&gt;

&lt;p&gt;The quota problem hit us immediately. Naive implementation: fire an API call for every process event. Reality: quota exhausted in under an hour on a busy machine. That forced us to completely rethink the data flow. The behavior scoring engine, the 60-second aggregation, the dual-database design — all of that exists because of one question we kept coming back to: &lt;em&gt;how do we make sure Gemini only sees what's actually worth its attention?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every architectural decision in this project traces back to that question. If you're building anything that involves a continuous data stream and an LLM, that's the question you need to answer first. Everything else flows from it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rate limits aren't just a bug — they shaped the whole system
&lt;/h3&gt;

&lt;p&gt;When we stress-tested with multiple concurrent investigations, we hit rate limits constantly. Five investigations running simultaneously, each doing 3-4 query rounds with large contexts — that's a lot of tokens per minute, very fast.&lt;/p&gt;

&lt;p&gt;The frustrating part: the error messages just said "resource exhausted." Is that requests per minute? Tokens per minute? Daily limit? These have completely different fixes. RPM you solve with throttling and request spacing. TPM you solve with context compression and smarter batching. Daily limits you solve with queuing strategy. Not knowing which one you're hitting means you're guessing at the solution while your quota keeps burning.&lt;/p&gt;

&lt;p&gt;We ended up implementing all three mitigations simultaneously because we couldn't tell which problem we were actually solving: exponential backoff with jitter, a hard cap on &lt;code&gt;max_query_rounds&lt;/code&gt; per investigation (default 4), a global concurrency limit (max 3 deep investigations at once), and dynamic thinking level selection so we're not burning high-compute calls on triage decisions that don't need them. The rate limit constraints literally shaped the concurrency model of the entire system — which is a weird thing to say but it's true.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thinking levels matter more than I expected
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;thinking_level="low"&lt;/code&gt; vs &lt;code&gt;thinking_level="high"&lt;/code&gt; isn't just a speed dial. It changes the quality of reasoning you get and what prompting strategies work well. We use low for fast triage — "is this worth investigating at all?" — and high for deep forensic analysis and report generation.&lt;/p&gt;

&lt;p&gt;Early on we used high thinking everywhere. Slower responses, heavier quota usage, and no meaningful quality improvement for simple yes/no triage decisions. Right tool for the right job. Sounds obvious in retrospect, but figuring out &lt;em&gt;which&lt;/em&gt; job needs which level took real experimentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cutting features is a skill
&lt;/h3&gt;

&lt;p&gt;We came into the hackathon wanting to build prevention features — automatically suspending suspicious processes, network isolation. Had it half-implemented. Then we cut all of it.&lt;/p&gt;

&lt;p&gt;Not because of time. Because we realized: if you're wrong on a false positive and your tool kills a legitimate process, you've broken trust permanently. Investigation and reporting empowers analysts. Autonomous process-killing is a liability. Cutting that scope made the project sharper and more honest about what it actually is. The disabled &lt;code&gt;beta_prevention&lt;/code&gt; block is still in &lt;code&gt;config.yaml&lt;/code&gt; — kept it as a reminder of the decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What genuinely worked
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The 1M token context window carried the whole investigation model.&lt;/strong&gt; I planned to build summarization logic to manage context across multi-turn investigations — compress old query results, drop less-relevant evidence as rounds progressed. Never needed any of it. The entire investigation history — all the autonomous queries, all the results, all the evidence across multiple rounds — fit comfortably. And Gemini would reason &lt;em&gt;across&lt;/em&gt; all of it in later rounds, catching connections between something from round 1 and new data from round 3. That cross-context reasoning was more capable than I expected going in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured JSON output was rock solid.&lt;/strong&gt; The autonomous query protocol only works if Gemini reliably returns machine-parseable decisions mid-analysis. I was genuinely nervous this would be flaky — sometimes JSON, sometimes Markdown-wrapped, sometimes off-schema. It wasn't. &lt;code&gt;response_mime_type="application/json"&lt;/code&gt; combined with a clear schema in the prompt was consistently reliable even when the underlying reasoning was complex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-turn reasoning quality is genuinely different.&lt;/strong&gt; The gap between "here's all the data, give me a verdict" and the autonomous multi-turn investigation is not subtle. The model caught things in round 3 that it completely missed or hand-waved in round 1. Letting it pull the data it actually needed, rather than us guessing upfront, made a real difference to the quality of the final verdicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where we hit friction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rate limit error messages need more context.&lt;/strong&gt; "Resource exhausted" isn't actionable. RPM, TPM, and daily limits all require different solutions, and not knowing which constraint you're hitting means you're solving the wrong problem while your quota keeps ticking down. Even a simple error code that differentiates the limit type would have saved us significant debugging time during the crunch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;thinking_level&lt;/code&gt; documentation is thin for practical use.&lt;/strong&gt; Finding the parameter was easy. Understanding the actual tradeoffs — which prompt structures work best at each level, how it affects structured output reliability, what temperature to pair with each level — was entirely trial and error. For anyone building agentic systems where you're making many API calls with different complexity levels, practical guidance here would save a lot of iteration time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini will over-query if you let it.&lt;/strong&gt; With high thinking enabled, it sometimes issued 5-6 autonomous queries when 2-3 would have been enough for a confident verdict. Thorough is good — but in a long-running monitoring system that's real quota cost accumulating over hours and days. Prompting it toward decisiveness helped somewhat, but the hard &lt;code&gt;max_query_rounds&lt;/code&gt; cap was ultimately necessary as a backstop. Guidance on prompting for query efficiency specifically in agentic loops — not just single-shot quality — would be useful to see in the docs.&lt;/p&gt;




&lt;p&gt;None of this broke the project. The core capability — letting Gemini autonomously decide what it needs and go get it — worked better than expected and is genuinely a different kind of AI integration than the standard request/response loop. PROCSee wouldn't exist without it.&lt;/p&gt;

&lt;p&gt;You can also check out my original Gemini 3 Hackathon submission on Devpost here: &lt;a href="https://devpost.com/software/procsee" rel="noopener noreferrer"&gt;https://devpost.com/software/procsee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[GitHub: &lt;a href="https://github.com/abbasmir12/procsee" rel="noopener noreferrer"&gt;https://github.com/abbasmir12/procsee&lt;/a&gt; | Built for the &lt;a href="https://gemini3.devpost.com/" rel="noopener noreferrer"&gt;Gemini 3 Hackathon&lt;/a&gt; on Devpost]&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>ai</category>
    </item>
    <item>
      <title>MindMelee: Beat AI in debate Arena!</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Sun, 15 Feb 2026 12:36:26 +0000</pubDate>
      <link>https://dev.to/mirshah12/mindmelee-beat-ai-in-debate-arena-5c36</link>
      <guid>https://dev.to/mirshah12/mindmelee-beat-ai-in-debate-arena-5c36</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;MindMelee&lt;/strong&gt; is basically your AI debate partner that's always ready to argue with you (in a good way!). I wanted to create something that helps people get better at debating without needing another person around.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/lqRVlVBc24M" rel="noopener noreferrer"&gt;https://youtu.be/lqRVlVBc24M&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtu.be/lqRVlVBc24M" rel="noopener noreferrer"&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%2Ficxwgfvr67mg8xmvltdu.jpg" alt="Watch the video" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app uses Google's Gemini Live API so you can actually talk to it like a real conversation. After each debate, it breaks down your performance - vocabulary, clarity, how persuasive you were, all that stuff. You can pick between two modes: Coach (nice and helpful) or Fierce (actually challenges you).&lt;/p&gt;

&lt;p&gt;The UI is pretty bold - I went for this neubrutalist style inspired by CodeJam. Big timer on the left, your conversation on the right. Only shows the last 5 messages so you stay focused instead of scrolling through everything.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/abbasmir12/mindmelee" rel="noopener noreferrer"&gt;github.com/abbasmir12/mindmelee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo Site:&lt;/strong&gt; &lt;a href="https://mindmelee.vercel.app/" rel="noopener noreferrer"&gt;https://mindmelee.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dashboard - Start Your Debate&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfhp2luzhnqnwmir9s8c.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%2Fvfhp2luzhnqnwmir9s8c.png" alt="Dashboard" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Debate Interface&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1wb7d6214mg29awgaw4y.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%2F1wb7d6214mg29awgaw4y.png" alt="Live Debate" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Analytics&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F705mjjk44jmi62lsi5xj.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%2F705mjjk44jmi62lsi5xj.png" alt="Analytics" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm still learning - only scored 30 on my first try 😒 Let me know what you get!&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Voice Debates&lt;/strong&gt; - Just talk naturally, AI responds right away&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bold Neubrutalist UI&lt;/strong&gt; - CodeJam-inspired design with smooth animations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Analytics&lt;/strong&gt; - See exactly where you're strong and where you need work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual AI Modes&lt;/strong&gt; - Coach mode for learning, Fierce mode when you want a real challenge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress Tracking&lt;/strong&gt; - Charts and heatmaps showing your improvement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persona Discovery&lt;/strong&gt; - Find out what kind of debater you are&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Okay, so here's the thing - I'm not gonna pretend Copilot CLI built this entire app for me. I designed everything, figured out the architecture, made all the creative decisions. But man, when it came to actually implementing stuff? Copilot CLI saved my life.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Actually Helped
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Talking to Code&lt;/strong&gt;&lt;br&gt;
Instead of spending hours reading docs, I could just ask Copilot CLI in plain English. Like when I needed the audio visualization thing - I just asked how to make a real-time audio analyzer. It gave me the code AND explained how the WebAudio API actually works. That's huge when you're learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Suggestions&lt;/strong&gt;&lt;br&gt;
The context-aware stuff is wild. While I was building the UI, it would suggest the exact Tailwind classes I needed for those neubrutalist shadows. It somehow understood the pattern I was going for and kept everything consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant Debugging&lt;/strong&gt;&lt;br&gt;
My components were re-rendering like crazy on every audio frame (performance nightmare). Copilot CLI spotted the issue immediately and told me to use refs instead. Saved me probably 3 hours of debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning on the Fly&lt;/strong&gt;&lt;br&gt;
This is what really got me - it doesn't just give you code, it teaches you. When I was struggling with Framer Motion, it explained spring physics and showed me this &lt;code&gt;mode="popLayout"&lt;/code&gt; feature I'd never seen. Every time I used it, I learned something new.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript Help&lt;/strong&gt;&lt;br&gt;
WebRTC and MediaStream types are confusing as hell. Copilot CLI just... knew the right types. And explained why they were needed. No more tab-switching to docs every 5 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Real Impact
&lt;/h3&gt;

&lt;p&gt;Look, what would've taken me days of Stack Overflow rabbit holes took minutes with Copilot CLI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebAudio API: 30 minutes vs. probably 4+ hours&lt;/li&gt;
&lt;li&gt;Framer Motion animations: 1 hour vs. a full day of trial and error&lt;/li&gt;
&lt;li&gt;Performance fixes: Instant vs. who knows how long&lt;/li&gt;
&lt;li&gt;TypeScript types: Right there vs. endless doc searching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it's not just about speed. Copilot CLI changed how I approach building stuff. I'm not scared to try new APIs anymore because I know I've got this AI pair programmer who can explain things in real-time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Moments
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Genius Suggestion&lt;/strong&gt;: Copilot CLI told me to use &lt;code&gt;flex-col-reverse&lt;/code&gt; for the chat feed. New messages at bottom, old ones fade out at top. So simple, so perfect. I wouldn't have thought of that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design Consistency&lt;/strong&gt;: It helped me keep the neubrutalist style consistent across 20+ components. Once it understood the pattern, it just... got it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance Win&lt;/strong&gt;: Fixed that re-render issue in seconds. Went from laggy mess to smooth 60fps just like that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Learning&lt;/strong&gt;: Finally understanding React's closure issues with useEffect. Not just fixing the bug, but actually getting why it happened.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;If you're building something complex by yourself, Copilot CLI is like having a senior dev on your team. Not to do the work for you - to help you do it better.&lt;/p&gt;

&lt;p&gt;I knew what I wanted to build. Copilot CLI helped me actually build it without getting stuck every 10 minutes. That's the difference between "cool idea" and "working app."&lt;/p&gt;

&lt;p&gt;MindMelee has real-time voice AI, complex animations, comprehensive analytics - stuff that requires knowing a lot of different things. Copilot CLI made it possible to tackle all of it without drowning in documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It Yourself
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/abbasmir12/mindmelee.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mindmelee
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your Gemini API key in Settings and start debating!&lt;/p&gt;




&lt;p&gt;I had the vision, Copilot CLI helped me execute it.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>MindMelee: Beat AI In Arena!</title>
      <dc:creator>Mir Shah</dc:creator>
      <pubDate>Sun, 15 Feb 2026 11:25:03 +0000</pubDate>
      <link>https://dev.to/mirshah12/mindmelee-beat-ai-in-arena-59i0</link>
      <guid>https://dev.to/mirshah12/mindmelee-beat-ai-in-arena-59i0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;MindMelee&lt;/strong&gt; is basically your AI debate partner that's always ready to argue with you (in a good way!). I wanted to create something that helps people get better at debating without needing another person around.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/lqRVlVBc24M" rel="noopener noreferrer"&gt;https://youtu.be/lqRVlVBc24M&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtu.be/lqRVlVBc24M" rel="noopener noreferrer"&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%2Ficxwgfvr67mg8xmvltdu.jpg" alt="Watch the video" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app uses Google's Gemini Live API so you can actually talk to it like a real conversation. After each debate, it breaks down your performance - vocabulary, clarity, how persuasive you were, all that stuff. You can pick between two modes: Coach (nice and helpful) or Fierce (actually challenges you).&lt;/p&gt;

&lt;p&gt;The UI is pretty bold - I went for this neubrutalist style inspired by CodeJam. Big timer on the left, your conversation on the right. Only shows the last 5 messages so you stay focused instead of scrolling through everything.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/abbasmir12/mindmelee" rel="noopener noreferrer"&gt;github.com/abbasmir12/mindmelee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo Site:&lt;/strong&gt; &lt;a href="https://mindmelee.vercel.app/" rel="noopener noreferrer"&gt;https://mindmelee.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dashboard - Start Your Debate&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfhp2luzhnqnwmir9s8c.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%2Fvfhp2luzhnqnwmir9s8c.png" alt="Dashboard" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Debate Interface&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1wb7d6214mg29awgaw4y.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%2F1wb7d6214mg29awgaw4y.png" alt="Live Debate" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Analytics&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F705mjjk44jmi62lsi5xj.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%2F705mjjk44jmi62lsi5xj.png" alt="Analytics" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm still learning - only scored 30 on my first try 😒 Let me know what you get!&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Voice Debates&lt;/strong&gt; - Just talk naturally, AI responds right away&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bold Neubrutalist UI&lt;/strong&gt; - CodeJam-inspired design with smooth animations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Analytics&lt;/strong&gt; - See exactly where you're strong and where you need work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual AI Modes&lt;/strong&gt; - Coach mode for learning, Fierce mode when you want a real challenge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress Tracking&lt;/strong&gt; - Charts and heatmaps showing your improvement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persona Discovery&lt;/strong&gt; - Find out what kind of debater you are&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Okay, so here's the thing - I'm not gonna pretend Copilot CLI built this entire app for me. I designed everything, figured out the architecture, made all the creative decisions. But man, when it came to actually implementing stuff? Copilot CLI saved my life.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Actually Helped
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Talking to Code&lt;/strong&gt;&lt;br&gt;
Instead of spending hours reading docs, I could just ask Copilot CLI in plain English. Like when I needed the audio visualization thing - I just asked how to make a real-time audio analyzer. It gave me the code AND explained how the WebAudio API actually works. That's huge when you're learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Suggestions&lt;/strong&gt;&lt;br&gt;
The context-aware stuff is wild. While I was building the UI, it would suggest the exact Tailwind classes I needed for those neubrutalist shadows. It somehow understood the pattern I was going for and kept everything consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant Debugging&lt;/strong&gt;&lt;br&gt;
My components were re-rendering like crazy on every audio frame (performance nightmare). Copilot CLI spotted the issue immediately and told me to use refs instead. Saved me probably 3 hours of debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning on the Fly&lt;/strong&gt;&lt;br&gt;
This is what really got me - it doesn't just give you code, it teaches you. When I was struggling with Framer Motion, it explained spring physics and showed me this &lt;code&gt;mode="popLayout"&lt;/code&gt; feature I'd never seen. Every time I used it, I learned something new.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript Help&lt;/strong&gt;&lt;br&gt;
WebRTC and MediaStream types are confusing as hell. Copilot CLI just... knew the right types. And explained why they were needed. No more tab-switching to docs every 5 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Real Impact
&lt;/h3&gt;

&lt;p&gt;Look, what would've taken me days of Stack Overflow rabbit holes took minutes with Copilot CLI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebAudio API: 30 minutes vs. probably 4+ hours&lt;/li&gt;
&lt;li&gt;Framer Motion animations: 1 hour vs. a full day of trial and error&lt;/li&gt;
&lt;li&gt;Performance fixes: Instant vs. who knows how long&lt;/li&gt;
&lt;li&gt;TypeScript types: Right there vs. endless doc searching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it's not just about speed. Copilot CLI changed how I approach building stuff. I'm not scared to try new APIs anymore because I know I've got this AI pair programmer who can explain things in real-time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Moments
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Genius Suggestion&lt;/strong&gt;: Copilot CLI told me to use &lt;code&gt;flex-col-reverse&lt;/code&gt; for the chat feed. New messages at bottom, old ones fade out at top. So simple, so perfect. I wouldn't have thought of that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design Consistency&lt;/strong&gt;: It helped me keep the neubrutalist style consistent across 20+ components. Once it understood the pattern, it just... got it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance Win&lt;/strong&gt;: Fixed that re-render issue in seconds. Went from laggy mess to smooth 60fps just like that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Learning&lt;/strong&gt;: Finally understanding React's closure issues with useEffect. Not just fixing the bug, but actually getting why it happened.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;If you're building something complex by yourself, Copilot CLI is like having a senior dev on your team. Not to do the work for you - to help you do it better.&lt;/p&gt;

&lt;p&gt;I knew what I wanted to build. Copilot CLI helped me actually build it without getting stuck every 10 minutes. That's the difference between "cool idea" and "working app."&lt;/p&gt;

&lt;p&gt;MindMelee has real-time voice AI, complex animations, comprehensive analytics - stuff that requires knowing a lot of different things. Copilot CLI made it possible to tackle all of it without drowning in documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It Yourself
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/abbasmir12/mindmelee.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mindmelee
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your Gemini API key in Settings and start debating!&lt;/p&gt;




&lt;p&gt;I had the vision, Copilot CLI helped me execute it.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
