<?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>Forem: Jaime </title>
    <description>The latest articles on Forem by Jaime  (@jaime_7997).</description>
    <link>https://forem.com/jaime_7997</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3914258%2F095c9a96-9f58-4e1f-b8b9-fef9ecb64ef6.png</url>
      <title>Forem: Jaime </title>
      <link>https://forem.com/jaime_7997</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jaime_7997"/>
    <language>en</language>
    <item>
      <title>A 100% local, offline AI desktop assistant built in Python. v1.2.0 brings SQLite memory migration, a custom Plugin Manager, and UI fixes for PyQt6. No cloud, no subscriptions.</title>
      <dc:creator>Jaime </dc:creator>
      <pubDate>Fri, 08 May 2026 08:05:59 +0000</pubDate>
      <link>https://forem.com/jaime_7997/a-100-local-offline-ai-desktop-assistant-built-in-python-v120-brings-sqlite-memory-migration-39n3</link>
      <guid>https://forem.com/jaime_7997/a-100-local-offline-ai-desktop-assistant-built-in-python-v120-brings-sqlite-memory-migration-39n3</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jaime_7997/refactoring-my-local-ai-assistant-moving-from-json-to-sqlite-and-plugins-v120-5dpl" class="crayons-story__hidden-navigation-link"&gt;Refactoring my Local AI Assistant: Moving from JSON to SQLite and Plugins (v1.2.0)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jaime_7997" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3914258%2F095c9a96-9f58-4e1f-b8b9-fef9ecb64ef6.png" alt="jaime_7997 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jaime_7997" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jaime 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jaime 
                
              
              &lt;div id="story-author-preview-content-3631815" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jaime_7997" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3914258%2F095c9a96-9f58-4e1f-b8b9-fef9ecb64ef6.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jaime &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jaime_7997/refactoring-my-local-ai-assistant-moving-from-json-to-sqlite-and-plugins-v120-5dpl" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 8&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jaime_7997/refactoring-my-local-ai-assistant-moving-from-json-to-sqlite-and-plugins-v120-5dpl" id="article-link-3631815"&gt;
          Refactoring my Local AI Assistant: Moving from JSON to SQLite and Plugins (v1.2.0)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/refactoring"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;refactoring&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jaime_7997/refactoring-my-local-ai-assistant-moving-from-json-to-sqlite-and-plugins-v120-5dpl" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jaime_7997/refactoring-my-local-ai-assistant-moving-from-json-to-sqlite-and-plugins-v120-5dpl#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

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

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

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>database</category>
      <category>python</category>
      <category>showdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jaime </dc:creator>
      <pubDate>Fri, 08 May 2026 08:02:21 +0000</pubDate>
      <link>https://forem.com/jaime_7997/-3ah6</link>
      <guid>https://forem.com/jaime_7997/-3ah6</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jaime_7997/building-a-local-jarvis-v11-adding-pc-automation-and-a-living-profile-48k0" class="crayons-story__hidden-navigation-link"&gt;Building a Local JARVIS (v1.1) 🤖: Adding PC Automation and a "Living Profile"&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jaime_7997" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3914258%2F095c9a96-9f58-4e1f-b8b9-fef9ecb64ef6.png" alt="jaime_7997 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jaime_7997" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jaime 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jaime 
                
              
              &lt;div id="story-author-preview-content-3619465" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jaime_7997" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3914258%2F095c9a96-9f58-4e1f-b8b9-fef9ecb64ef6.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jaime &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jaime_7997/building-a-local-jarvis-v11-adding-pc-automation-and-a-living-profile-48k0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jaime_7997/building-a-local-jarvis-v11-adding-pc-automation-and-a-living-profile-48k0" id="article-link-3619465"&gt;
          Building a Local JARVIS (v1.1) 🤖: Adding PC Automation and a "Living Profile"
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/github"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;github&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jaime_7997/building-a-local-jarvis-v11-adding-pc-automation-and-a-living-profile-48k0" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jaime_7997/building-a-local-jarvis-v11-adding-pc-automation-and-a-living-profile-48k0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

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

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

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Refactoring my Local AI Assistant: Moving from JSON to SQLite and Plugins (v1.2.0)</title>
      <dc:creator>Jaime </dc:creator>
      <pubDate>Fri, 08 May 2026 07:55:50 +0000</pubDate>
      <link>https://forem.com/jaime_7997/refactoring-my-local-ai-assistant-moving-from-json-to-sqlite-and-plugins-v120-5dpl</link>
      <guid>https://forem.com/jaime_7997/refactoring-my-local-ai-assistant-moving-from-json-to-sqlite-and-plugins-v120-5dpl</guid>
      <description>&lt;p&gt;A few days ago, I built a local virtual assistant in Python (JARVIS) using &lt;strong&gt;Ollama&lt;/strong&gt;, &lt;strong&gt;PyQt6&lt;/strong&gt;, and &lt;strong&gt;Piper TTS&lt;/strong&gt;. It was a fun MVP, but as I started using it daily, the architectural flaws became obvious. &lt;/p&gt;

&lt;p&gt;Hardcoding tool calls into the main loop made the file massive, and storing conversation history in flat &lt;code&gt;.json&lt;/code&gt; files wasn't scalable. &lt;/p&gt;

&lt;p&gt;I just released the &lt;strong&gt;v1.2.0 update&lt;/strong&gt;, focusing purely on technical debt and scalability. Here is a breakdown of the refactoring process:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Database Migration (SQLite)
&lt;/h3&gt;

&lt;p&gt;Previously, JARVIS saved facts (like user preferences) and chat history in JSON. I ripped that out and implemented a &lt;code&gt;jarvis_memory.db&lt;/code&gt; using SQLite. Now, when the LLM triggers the &lt;code&gt;guardar_recuerdo&lt;/code&gt; (save memory) tool, it executes a clean SQL insert. &lt;br&gt;
&lt;em&gt;Note for dev newbies: When using SQLite in a desktop app, make sure to use &lt;code&gt;sys.exit(0)&lt;/code&gt; instead of &lt;code&gt;os._exit()&lt;/code&gt; on shutdown to prevent WAL (Write-Ahead Logging) corruption!&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Decoupling with a Plugin Manager
&lt;/h3&gt;

&lt;p&gt;I wanted the assistant to control PC apps, smart lights, or Discord, but I didn't want a 2000-line main file. I created a &lt;code&gt;plugin_manager.py&lt;/code&gt;. It scans a &lt;code&gt;/plugins&lt;/code&gt; directory on startup, dynamically reads the &lt;code&gt;__doc__&lt;/code&gt; strings and functions of any Python script inside, and injects them as available JSON tools into the LLM's system prompt. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Fixing TTS Crashes with RegEx
&lt;/h3&gt;

&lt;p&gt;Local TTS models like Piper are incredibly fast and private, but they are fragile. If JARVIS searched Wikipedia and the LLM returned text containing IPA phonetics (e.g., &lt;code&gt;/ˈalbɐt ˈaɪnʃtaɪn/&lt;/code&gt;), Piper would crash with &lt;code&gt;Error 0&lt;/code&gt;. &lt;br&gt;
The fix? I built a RegEx preprocessing pipeline that runs right before the audio synthesis to strip brackets, emojis, and phonetic strings, ensuring the TTS worker never chokes on weird characters.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reactive UI Improvements
&lt;/h3&gt;

&lt;p&gt;Since the UI is a borderless PyQt6 window, text alignment was getting wonky on long responses. I implemented proper WordWrap and added a &lt;code&gt;VisualizadorAudio&lt;/code&gt; class: a custom &lt;code&gt;QWidget&lt;/code&gt; that uses &lt;code&gt;math.sin&lt;/code&gt; to generate a smooth, responsive cyan equalizer that animates only when the TTS daemon is actively speaking.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;The codebase is now clean, modular, and much faster. If you are building local LLM wrappers or Python desktop apps, feel free to poke around the code and see how the UI and Tool Calling interact.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Check out the code on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Jm7997/JARVIS" rel="noopener noreferrer"&gt;https://github.com/Jm7997/JARVIS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have ideas for cool plugins I could add next, drop a comment!&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>refactoring</category>
      <category>ai</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jaime </dc:creator>
      <pubDate>Wed, 06 May 2026 08:03:11 +0000</pubDate>
      <link>https://forem.com/jaime_7997/-4dji</link>
      <guid>https://forem.com/jaime_7997/-4dji</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jaime_7997/i-built-a-local-ai-virtual-assistant-jarvis-inspired-using-python-pyqt6-and-ollama-513b" class="crayons-story__hidden-navigation-link"&gt;I built a local AI Virtual Assistant (JARVIS inspired) using Python, PyQt6 and Ollama.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jaime_7997" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3914258%2F095c9a96-9f58-4e1f-b8b9-fef9ecb64ef6.png" alt="jaime_7997 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jaime_7997" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jaime 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jaime 
                
              
              &lt;div id="story-author-preview-content-3616011" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jaime_7997" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3914258%2F095c9a96-9f58-4e1f-b8b9-fef9ecb64ef6.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jaime &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jaime_7997/i-built-a-local-ai-virtual-assistant-jarvis-inspired-using-python-pyqt6-and-ollama-513b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 5&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jaime_7997/i-built-a-local-ai-virtual-assistant-jarvis-inspired-using-python-pyqt6-and-ollama-513b" id="article-link-3616011"&gt;
          I built a local AI Virtual Assistant (JARVIS inspired) using Python, PyQt6 and Ollama.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/github"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;github&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jaime_7997/i-built-a-local-ai-virtual-assistant-jarvis-inspired-using-python-pyqt6-and-ollama-513b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jaime_7997/i-built-a-local-ai-virtual-assistant-jarvis-inspired-using-python-pyqt6-and-ollama-513b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              4&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

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

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

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Building a Local JARVIS (v1.1) 🤖: Adding PC Automation and a "Living Profile"</title>
      <dc:creator>Jaime </dc:creator>
      <pubDate>Wed, 06 May 2026 08:02:24 +0000</pubDate>
      <link>https://forem.com/jaime_7997/building-a-local-jarvis-v11-adding-pc-automation-and-a-living-profile-48k0</link>
      <guid>https://forem.com/jaime_7997/building-a-local-jarvis-v11-adding-pc-automation-and-a-living-profile-48k0</guid>
      <description>&lt;p&gt;Hi everyone! Yesterday, I shared the first version of my 100% offline JARVIS desktop assistant built with Python, PyQt6, and Ollama. &lt;/p&gt;

&lt;p&gt;Thanks to the feedback and ideas I've received (like adding Spotify integration and improving how the AI handles memory), I got straight to work. Today, I'm excited to share &lt;strong&gt;Version 1.1&lt;/strong&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 What's New in v1.1?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;🧠 The "Living Profile":&lt;/strong&gt; I wanted JARVIS to know me without scanning my hard drive. Now, it reads a private, local &lt;code&gt;system_profile.txt&lt;/code&gt; on startup. This injects my name, interests, and preferred tone into the system prompt. JARVIS knows who I am from second zero!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚙️ Native PC Automation:&lt;/strong&gt; I built an &lt;code&gt;automations.py&lt;/code&gt; module. You can now tell JARVIS to play/pause Spotify, launch Steam games, or even send Discord messages via pyautogui/webhooks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👁️ Drag-and-Drop Vision:&lt;/strong&gt; I integrated support for the &lt;strong&gt;LLaVA&lt;/strong&gt; model. You can now drag images directly into the holographic UI and ask JARVIS to analyze them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗣️ Smart Bilingual Voice:&lt;/strong&gt; The voice recognition now dynamically checks for Spanish and English inputs seamlessly on a single audio capture.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  💻 Check out the code
&lt;/h3&gt;

&lt;p&gt;I've refactored the routing logic to handle these new features efficiently. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/Jm7997/JARVIS" rel="noopener noreferrer"&gt;https://github.com/Jm7997/JARVIS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts on the new architecture, specially the &lt;code&gt;automations.py&lt;/code&gt; module. What feature should I build next?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>I built a local AI Virtual Assistant (JARVIS inspired) using Python, PyQt6 and Ollama.</title>
      <dc:creator>Jaime </dc:creator>
      <pubDate>Tue, 05 May 2026 14:50:51 +0000</pubDate>
      <link>https://forem.com/jaime_7997/i-built-a-local-ai-virtual-assistant-jarvis-inspired-using-python-pyqt6-and-ollama-513b</link>
      <guid>https://forem.com/jaime_7997/i-built-a-local-ai-virtual-assistant-jarvis-inspired-using-python-pyqt6-and-ollama-513b</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;I've been working on a personal project to create a desktop virtual assistant that doesn't rely on the cloud. I wanted something that felt like &lt;strong&gt;JARVIS&lt;/strong&gt; but kept my data 100% private.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ How it works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Brain:&lt;/strong&gt; It uses &lt;strong&gt;Ollama&lt;/strong&gt; as the backend, so you can run models like Llama 3, Mistral, or Phi-3 locally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interface:&lt;/strong&gt; Built with &lt;strong&gt;PyQt6&lt;/strong&gt; featuring a "holographic" glassmorphism effect (transparent and sleek).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Memory:&lt;/strong&gt; It has a persistent local memory system to remember previous interactions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice:&lt;/strong&gt; Integrated with Piper for realistic text-to-speech.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔒 Why local?
&lt;/h3&gt;

&lt;p&gt;I wanted to prove that you don't need OpenAI or Google to have a functional assistant. This runs entirely on your hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  📂 Source Code &amp;amp; Setup:
&lt;/h3&gt;

&lt;p&gt;I've made the repository public and wrote a full guide on how to set it up (it's very easy!).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it out here:&lt;/strong&gt; &lt;a href="https://github.com/Jm7997/JARVIS" rel="noopener noreferrer"&gt;https://github.com/Jm7997/JARVIS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm still a student/learning, so I'd really appreciate any feedback, feature ideas, or even a star on GitHub if you find it cool!&lt;/p&gt;

&lt;p&gt;What features should I add next? (I'm thinking about Spotify integration or home automation).&lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;I wanted to build a JARVIS-like assistant that works completely offline to learn more about integrating LLMs with Python and creating transparent UIs with PyQt6.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;p&gt;It provides a holographic-style desktop interface to chat with local AI models via Ollama, including persistent conversation memory and text-to-speech.&lt;/p&gt;

&lt;h3&gt;
  
  
  Target Audience
&lt;/h3&gt;

&lt;p&gt;Anyone interested in local AI, desktop automation, or learning how to use PyQt6 for modern-looking Python applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparison
&lt;/h3&gt;

&lt;p&gt;Unlike other cloud-based assistants, this is 100% private and runs on your own hardware without subscription fees or API keys.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>github</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
