<?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: Sankalp Kulkarni</title>
    <description>The latest articles on DEV Community by Sankalp Kulkarni (@shriisoot).</description>
    <link>https://dev.to/shriisoot</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%2F3995566%2F51b87425-6153-4fb8-9b3d-9a72b7b29216.png</url>
      <title>DEV Community: Sankalp Kulkarni</title>
      <link>https://dev.to/shriisoot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shriisoot"/>
    <language>en</language>
    <item>
      <title>I built a fully local AI assistant at 16 — no cloud, no API keys, runs on your GPU</title>
      <dc:creator>Sankalp Kulkarni</dc:creator>
      <pubDate>Mon, 22 Jun 2026 21:44:27 +0000</pubDate>
      <link>https://dev.to/shriisoot/i-built-a-fully-local-ai-assistant-at-16-no-cloud-no-api-keys-runs-on-your-gpu-am4</link>
      <guid>https://dev.to/shriisoot/i-built-a-fully-local-ai-assistant-at-16-no-cloud-no-api-keys-runs-on-your-gpu-am4</guid>
      <description>&lt;p&gt;I'm 16, from Pune, India. For the past couple of years I've been building &lt;strong&gt;O-AI&lt;/strong&gt; — a fully local AI desktop assistant. No cloud. No API keys. No data leaving your machine. Everything runs on your own GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Every AI assistant I tried sent data somewhere. ChatGPT, Copilot, Gemini — all cloud. I wanted something that felt like JARVIS from Iron Man: smart, fast, personal, and private. So I built it from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What O-AI can do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Core engine:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs LLMs fully on-device via llama.cpp / Ollama (zero internet required)&lt;/li&gt;
&lt;li&gt;Self-learning core — extracts facts from every conversation and stores them permanently&lt;/li&gt;
&lt;li&gt;Fine-tuning pipeline — train the model on your own data, locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Voice &amp;amp; language:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Voice control in English, Hindi, and Marathi via Whisper (running locally)&lt;/li&gt;
&lt;li&gt;Responds in whatever language you speak&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Modes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JARVIS mode — arc-reactor HUD, 4 reactive states, British-male voice, "sir" persona&lt;/li&gt;
&lt;li&gt;Take Over PC mode — full desktop automation&lt;/li&gt;
&lt;li&gt;Animated floating desktop pet (4 types, draggable, reacts to voice)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;30+ automation fast-paths:&lt;/strong&gt; open apps, search the web, control media, screen vision, run code, edit files, cursor control, social media steps, clipboard ops...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-step agent system:&lt;/strong&gt; plan → execute → verify loop with 14+ step types (web_search, fetch_url, read_screen, run_code, edit_file, open_social, and more)&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Backend:  Python (Flask IPC + agent core)
Frontend: Electron + vanilla JS
LLM:      llama.cpp / Ollama
Voice:    Whisper (local) + Edge TTS / neural voice
Vision:   PIL + screen capture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The hardest bugs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Says done but isn't"&lt;/strong&gt; — Early versions reported success even when an agent step failed. Fixed by building a proper outcome verifier that reads the actual result, not the plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "opens a random video" bug&lt;/strong&gt; — Asking the agent to play something would open random YouTube videos. Root cause: the plan validator wasn't catching placeholder URLs like &lt;code&gt;[video_url]&lt;/code&gt;. Fixed with a universal content guard on all plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPU offloading on Windows&lt;/strong&gt; — Getting all 32 layers onto the GPU with the right CUDA flags took way too long. Worth it though.&lt;/p&gt;

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

&lt;p&gt;Building something real teaches you more than any tutorial. Every bug is a design decision you haven't made yet. If you're not embarrassed by v1, you shipped too late.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Shriisoot" rel="noopener noreferrer"&gt;github.com/Shriisoot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Portfolio + TheLab: &lt;a href="https://sankalpkulkarni.com" rel="noopener noreferrer"&gt;sankalpkulkarni.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Instagram: &lt;a href="https://instagram.com/shriisoot" rel="noopener noreferrer"&gt;@shriisoot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building something local-first with LLMs, drop a comment — I'd love to compare notes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
