<?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: Paul Holland</title>
    <description>The latest articles on DEV Community by Paul Holland (@paulholland511).</description>
    <link>https://dev.to/paulholland511</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%2F3970063%2F9ecab84e-2960-4a81-8a8a-abe446ea2c90.jpeg</url>
      <title>DEV Community: Paul Holland</title>
      <link>https://dev.to/paulholland511</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paulholland511"/>
    <language>en</language>
    <item>
      <title>How I Built a Personal AI Operating System with Claude, Python, and Local LLMs</title>
      <dc:creator>Paul Holland</dc:creator>
      <pubDate>Fri, 05 Jun 2026 15:08:07 +0000</pubDate>
      <link>https://dev.to/paulholland511/how-i-built-a-personal-ai-operating-system-with-claude-python-and-local-llms-56e2</link>
      <guid>https://dev.to/paulholland511/how-i-built-a-personal-ai-operating-system-with-claude-python-and-local-llms-56e2</guid>
      <description>&lt;p&gt;Every AI conversation I had vanished the moment I closed the tab. Weeks of research, planning sessions, decision context — gone. So I built a system that fixes that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlas OS&lt;/strong&gt; is an open-source "personal operating system" that wraps Claude Cowork with persistent memory, local RAG search, scheduled automation, and a web dashboard. It turns a stateless chatbot into something that remembers everything and works while you sleep.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/paulholland511/atlas-os" rel="noopener noreferrer"&gt;paulholland511/atlas-os&lt;/a&gt; | &lt;code&gt;pip install atlas-os&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│                 atlas CLI                    │
│   init · doctor · search · embed · dashboard │
├──────────┬──────────┬───────────┬───────────┤
│  Vault   │   RAG    │  Skills   │  Backends │
│  Parser  │  Engine  │  160+     │  LM Studio│
│  Git Sync│  SQLite  │  Market-  │  Ollama   │
│  Session │  BM25+Vec│  place    │  llama.cpp│
│  Capture │  Rerank  │  Registry │  OpenAI   │
├──────────┴──────────┴───────────┴───────────┤
│          Obsidian Markdown Vault             │
│         (your files, your machine)           │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire system is local-first. Your notes, embeddings, and knowledge graph never leave your machine. The "database" is a folder of markdown files. History is plain git. Everything is diffable, portable, and yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why SQLite for vectors (not Pinecone/Weaviate)
&lt;/h3&gt;

&lt;p&gt;I chose &lt;code&gt;sqlite-vec&lt;/code&gt; for the vector store because it's zero-config, embeds directly in the process, and needs no running service. For a personal knowledge base with ~10K chunks, the KNN search is fast enough and the operational overhead is zero. There's a NumPy cosine fallback for environments without the C extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why hybrid search (not just embeddings)
&lt;/h3&gt;

&lt;p&gt;Pure vector search misses exact matches. Pure keyword search misses meaning. Atlas OS fuses both:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;BM25&lt;/strong&gt; scores every chunk by term frequency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector cosine&lt;/strong&gt; scores by semantic similarity
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reciprocal Rank Fusion&lt;/strong&gt; merges both ranked lists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TF-IDF reranking&lt;/strong&gt; refines the top results&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This consistently outperforms either approach alone, especially for a personal vault where you remember &lt;em&gt;words&lt;/em&gt; you used but also need &lt;em&gt;conceptual&lt;/em&gt; matches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Flask (not React)
&lt;/h3&gt;

&lt;p&gt;The dashboard ships as part of the Python package — &lt;code&gt;atlas dashboard&lt;/code&gt; starts it. No &lt;code&gt;npm install&lt;/code&gt;, no build step, no node_modules. Seven panels: system health, audit trail, scheduled tasks, skills, vector store stats, RAG search, and a D3.js knowledge graph. All rendered server-side with Jinja2 and inline CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Actually Does Day-to-Day
&lt;/h2&gt;

&lt;p&gt;The system runs scheduled tasks autonomously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session capture&lt;/strong&gt; — every Cowork conversation gets saved as a markdown note in your vault, twice daily. Summaries, key actions, files touched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG indexing&lt;/strong&gt; — semantic chunking + embedding runs incrementally. New notes are searchable within minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email briefings&lt;/strong&gt; — a morning report lands in your inbox with vault status, pending tasks, and a system health check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trading research&lt;/strong&gt; — a multi-agent module writes market briefings into the vault (I use this for crypto research, not financial advice).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;400+ tests&lt;/strong&gt;, CI/CD via GitHub Actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;160+ installable skills&lt;/strong&gt; with a marketplace and registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pluggable LLM backends&lt;/strong&gt; — auto-detects LM Studio, Ollama, llama.cpp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Append-only audit trail&lt;/strong&gt; — every autonomous action logged to JSONL&lt;/li&gt;
&lt;li&gt;Docker support, MIT licensed&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Session persistence is the killer feature.&lt;/strong&gt; Everything else — RAG, dashboards, skills — only matters because the vault remembers. Without that, you're rebuilding context every session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hybrid search is worth the complexity.&lt;/strong&gt; The BM25 + vector + RRF pipeline was the single biggest quality improvement over pure embedding search.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local-first is a real constraint but worth it.&lt;/strong&gt; No cloud dependencies means the system works offline, on planes, and never leaks data. But it means managing your own embedding server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git as the sync layer is underrated.&lt;/strong&gt; Every vault change is a commit. You get free versioning, branching, and conflict detection. The merge conflicts are the hard part (v3.0 roadmap addresses this).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's Next (v3.0)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Extension architecture — decouple trading/voice/job modules into optional extras&lt;/li&gt;
&lt;li&gt;MCP skills — every skill becomes a Model Context Protocol server&lt;/li&gt;
&lt;li&gt;Security sandbox — AST analysis + runtime isolation for community skills&lt;/li&gt;
&lt;li&gt;Git hardening — proper merge strategies for concurrent vault access&lt;/li&gt;
&lt;li&gt;Pluggable vector backends — LanceDB and ChromaDB alongside sqlite-vec&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The repo is at &lt;a href="https://github.com/paulholland511/atlas-os" rel="noopener noreferrer"&gt;github.com/paulholland511/atlas-os&lt;/a&gt;. Install with &lt;code&gt;pip install atlas-os&lt;/code&gt;, run &lt;code&gt;atlas init&lt;/code&gt;, and you're up in five minutes. Feedback and contributions welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>rag</category>
    </item>
  </channel>
</rss>
