<?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.us-east-2.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>Eidetic OS vs Mem0 vs Letta vs Khoj — Choosing an AI Memory Layer in 2026</title>
      <dc:creator>Paul Holland</dc:creator>
      <pubDate>Thu, 11 Jun 2026 19:53:11 +0000</pubDate>
      <link>https://dev.to/paulholland511/eidetic-os-vs-mem0-vs-letta-vs-khoj-choosing-an-ai-memory-layer-in-2026-37a3</link>
      <guid>https://dev.to/paulholland511/eidetic-os-vs-mem0-vs-letta-vs-khoj-choosing-an-ai-memory-layer-in-2026-37a3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I'm Paul Holland, the solo developer behind Eidetic OS. I built it because nothing else gave me what I wanted — local-first AI memory that I actually own and understand. This comparison is my honest attempt to map the landscape fairly. I'll tell you where the others are stronger, and where I think Eidetic wins.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: AI Has Amnesia
&lt;/h2&gt;

&lt;p&gt;Every time you start a new chat with an LLM, it forgets everything. Your preferences, your project context, last week's conversation — gone. The industry has responded with a handful of "memory layer" tools, each taking a different approach to the problem.&lt;/p&gt;

&lt;p&gt;If you're evaluating options in 2026, there are five worth looking at seriously: &lt;strong&gt;Eidetic OS&lt;/strong&gt;, &lt;strong&gt;Mem0&lt;/strong&gt;, &lt;strong&gt;Letta&lt;/strong&gt; (formerly MemGPT), &lt;strong&gt;Khoj&lt;/strong&gt;, and &lt;strong&gt;Nucleus MCP&lt;/strong&gt;. They range from VC-funded cloud platforms to solo-dev open-source projects. Let's break them down.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Contenders
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Eidetic OS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source, local-first AI memory operating system. Python CLI with 20+ subcommands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; SQLite + sqlite-vec. No external database dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search:&lt;/strong&gt; Hybrid retrieval combining BM25 lexical search with vector similarity, fused via Reciprocal Rank Fusion (RRF), then reranked with TF-IDF scoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory model:&lt;/strong&gt; Three-tier architecture — Core, Recall, and Archival with exponential decay: P(M) = e^(-λt) * (1 + βf).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt; Five-tier GROUND-style pipeline. Ed25519 cryptographic signatures with SHA-256 hash chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrations:&lt;/strong&gt; Obsidian vault sync, MCP skills, extension architecture. Works with local LLMs via LM Studio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mem0 ($24M funded)
&lt;/h3&gt;

&lt;p&gt;Managed memory layer. Cloud-hosted, API-driven. Graph-based memory with entity extraction. Best for production SaaS apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Letta ($10M funded, formerly MemGPT)
&lt;/h3&gt;

&lt;p&gt;Stateful AI agent framework with persistent memory. Powerful but complex. Best for agent orchestration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Khoj (open-source)
&lt;/h3&gt;

&lt;p&gt;Personal AI assistant with memory and search. Good UX, less technically extensible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nucleus MCP
&lt;/h3&gt;

&lt;p&gt;MCP-based memory server. Clean architecture, newer and less mature.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Eidetic OS&lt;/th&gt;
&lt;th&gt;Mem0&lt;/th&gt;
&lt;th&gt;Letta&lt;/th&gt;
&lt;th&gt;Khoj&lt;/th&gt;
&lt;th&gt;Nucleus MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local-first&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Cloud + self-hosted&lt;/td&gt;
&lt;td&gt;Cloud + self-hosted&lt;/td&gt;
&lt;td&gt;Local (MCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free / OSS&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;td&gt;Free / OSS + cloud&lt;/td&gt;
&lt;td&gt;Free / OSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQLite + sqlite-vec&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;td&gt;Postgres + vector&lt;/td&gt;
&lt;td&gt;Postgres / SQLite&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BM25 + vector hybrid, RRF&lt;/td&gt;
&lt;td&gt;Graph + vector&lt;/td&gt;
&lt;td&gt;Vector + agent routing&lt;/td&gt;
&lt;td&gt;Vector + keyword&lt;/td&gt;
&lt;td&gt;Vector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3-tier with decay&lt;/td&gt;
&lt;td&gt;Graph entities&lt;/td&gt;
&lt;td&gt;Agent blocks&lt;/td&gt;
&lt;td&gt;Flat docs&lt;/td&gt;
&lt;td&gt;Key-value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5-tier + Ed25519&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local, hackable, auditable&lt;/td&gt;
&lt;td&gt;Production SaaS&lt;/td&gt;
&lt;td&gt;Stateful agents&lt;/td&gt;
&lt;td&gt;Personal KM&lt;/td&gt;
&lt;td&gt;MCP ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where Each One Wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mem0 wins&lt;/strong&gt; for production apps scaling memory across thousands of users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Letta wins&lt;/strong&gt; for full agent orchestration with memory as a component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khoj wins&lt;/strong&gt; for personal AI with a polished interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nucleus MCP wins&lt;/strong&gt; on MCP ecosystem elegance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eidetic OS wins&lt;/strong&gt; if you care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; Data never leaves your machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability:&lt;/strong&gt; Ed25519 + SHA-256 hash chain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval quality:&lt;/strong&gt; Hybrid BM25 + vector with RRF fusion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory realism:&lt;/strong&gt; Exponential decay prevents stale context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification:&lt;/strong&gt; Five-tier validation before content reaches your LLM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hackability:&lt;/strong&gt; Python CLI, no black boxes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Honest Assessment
&lt;/h2&gt;

&lt;p&gt;Eidetic OS is a solo project, not a venture-backed platform. But if you value understanding your own stack, want AI memory that respects your privacy, and believe verification and audit are features — not afterthoughts — then Eidetic OS was built for you.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/paulholland511/eidetic-os" rel="noopener noreferrer"&gt;github.com/paulholland511/eidetic-os&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star the repo if you find it useful. Open an issue if you don't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Paul Holland builds Eidetic OS. He believes AI memory should be local, verifiable, and yours.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>From Personal Tool to Enterprise Platform: Where Eidetic OS Is Heading Next</title>
      <dc:creator>Paul Holland</dc:creator>
      <pubDate>Sat, 06 Jun 2026 17:27:31 +0000</pubDate>
      <link>https://dev.to/paulholland511/from-personal-tool-to-enterprise-platform-where-eidetic-os-is-heading-next-318l</link>
      <guid>https://dev.to/paulholland511/from-personal-tool-to-enterprise-platform-where-eidetic-os-is-heading-next-318l</guid>
      <description>&lt;p&gt;Six months ago I built a Python script that saved my Claude conversations to markdown files. Today it's a full personal AI operating system — 160+ skills, hybrid RAG search, pluggable vector backends, a web dashboard, fact extraction, memory decay scoring, and an Obsidian plugin. Here's the technical story of how each decision was made, what we tried, what failed, and where it's going next.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhzxkgl0fdlbnzuka923.gif" 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%2Fwhzxkgl0fdlbnzuka923.gif" alt="Eidetic OS Demo" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I'm an IT operations manager. I use AI every day — architecture planning, debugging, code review, research. The problem: every conversation disappeared when I closed the tab. I'd spend an hour explaining my infrastructure to Claude, get great advice, then next session start from scratch.&lt;/p&gt;

&lt;p&gt;I tried the obvious solutions first. Conversation history? Too noisy — full of corrections, tangents, tool output. Copy-pasting notes? Doesn't scale past a week. Third-party tools? Either cloud-dependent (privacy concern) or too basic.&lt;/p&gt;

&lt;p&gt;So I built my own. The core thesis: &lt;strong&gt;your AI should remember everything and work while you sleep.&lt;/strong&gt; Everything that followed was in service of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture Decisions (And Why)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────┐
│                      eidetic CLI                          │
│   init · doctor · search · embed · dashboard · skills     │
├──────────┬──────────┬───────────┬────────────────────────┤
│  Vault   │   RAG    │  Skills   │   LLM Backends         │
│  Markdown│  Hybrid  │  160+     │   LM Studio / Ollama   │
│  Git Sync│  BM25+Vec│  MCP      │   llama.cpp / OpenAI   │
├──────────┼──────────┼───────────┼────────────────────────┤
│  Fact    │ Security │  Vector   │   Dashboard            │
│  Extract │ AST Scan │  Backends │   Flask + D3.js        │
│  Memory  │ Sandbox  │  SQLite   │   7 Panels             │
│  Decay   │ Audit    │  LanceDB  │   Knowledge Graph      │
├──────────┴──────────┴───────────┴────────────────────────┤
│               Obsidian Markdown Vault                     │
│        (your files, your machine, git-versioned)          │
└──────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Obsidian Markdown (Not a Database)
&lt;/h3&gt;

&lt;p&gt;The first decision was storage format. I could have used SQLite from day one, or Postgres, or a purpose-built knowledge graph database. I chose plain markdown files in an Obsidian vault. Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human-readable&lt;/strong&gt; — I can open any file in a text editor and read it. No special tooling needed to inspect my memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git-versioned&lt;/strong&gt; — Every change is a commit. Free versioning, branching, diffing, conflict detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt; — Move the folder to another machine and everything works. No database migrations, no server processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian-native&lt;/strong&gt; — I already lived in Obsidian for personal notes. The vault is my knowledge base &lt;em&gt;and&lt;/em&gt; my AI's memory. One source of truth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off: markdown isn't searchable by meaning. That's where the RAG pipeline comes in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Hybrid Search (BM25 + Vector + RRF + TF-IDF)
&lt;/h3&gt;

&lt;p&gt;Pure vector search sounds elegant. Embed everything, find similar chunks, done. In practice it misses exact matches constantly. If I search for "sqlite-vec", embedding search returns results about "vector databases in general" but misses the specific chunk where I chose that library.&lt;/p&gt;

&lt;p&gt;Pure keyword search (BM25) catches exact terms but misses conceptual connections. "What did we decide about the authentication approach?" won't find a chunk that talks about "JWT token validation strategy."&lt;/p&gt;

&lt;p&gt;So we fuse both:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;BM25&lt;/strong&gt; scores by term frequency (catches exact matches)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector cosine&lt;/strong&gt; scores by semantic similarity (catches conceptual matches)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reciprocal Rank Fusion&lt;/strong&gt; merges both ranked lists with k=60 (prevents either method from dominating)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TF-IDF reranking&lt;/strong&gt; refines the top results (boosts rare, query-specific terms)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query: "What vector database did we choose?"
         │
         ├──► BM25 Keyword Search ──► chunks with "vector", "database"
         │
         ├──► Vector Cosine Search ──► chunks about "embedding storage"
         │
         ├──► Reciprocal Rank Fusion (k=60) ──► merged ranking
         │
         └──► TF-IDF Reranking ──► final top-N results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was the single biggest quality improvement in the entire project. The jump from pure vector search to hybrid was immediately noticeable — suddenly the system could find both the exact library name &lt;em&gt;and&lt;/em&gt; the reasoning behind choosing it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dwshepf19cjhsuzh3oy.gif" 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%2F6dwshepf19cjhsuzh3oy.gif" alt="Hybrid RAG Search" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why SQLite-vec (Not Pinecone/Weaviate/Qdrant)
&lt;/h3&gt;

&lt;p&gt;For a personal knowledge base with ~10K chunks, you don't need a vector database service. You need something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires zero configuration&lt;/li&gt;
&lt;li&gt;Embeds in the Python process (no running server)&lt;/li&gt;
&lt;li&gt;Has no cloud dependency&lt;/li&gt;
&lt;li&gt;Is fast enough for KNN over 10K vectors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;sqlite-vec&lt;/code&gt; does all of this. It's a SQLite extension. Your vectors live in the same database as your metadata. &lt;code&gt;pip install&lt;/code&gt; and you're done.&lt;/p&gt;

&lt;p&gt;We added LanceDB and ChromaDB as pluggable alternatives (swap with one config line) for anyone who outgrows SQLite. But for 99% of personal use, SQLite is the right answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Local LLMs (Not Just Cloud APIs)
&lt;/h3&gt;

&lt;p&gt;Every embedding, every search, every analysis can run on your hardware. We auto-detect LM Studio, Ollama, and llama.cpp at startup. No API keys required.&lt;/p&gt;

&lt;p&gt;This isn't ideological — it's practical. I work on planes. I work in environments where sending data to cloud APIs isn't an option. And for a system that stores your complete professional context, keeping embeddings local isn't a luxury, it's a requirement.&lt;/p&gt;

&lt;p&gt;We &lt;em&gt;also&lt;/em&gt; support OpenAI-compatible APIs for people who want cloud speed. But the system works fully offline by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Extensions (Not a Monolithic CLI)
&lt;/h3&gt;

&lt;p&gt;By v2.0, the CLI was a 1,500-line monster. Trading commands, voice synthesis, job tracking — all in one file. Every user got every feature. Adding a module meant editing the core.&lt;/p&gt;

&lt;p&gt;v3.0 ripped it apart into a pluggable extension system using setuptools entry-points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os              &lt;span class="c"&gt;# Core only&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os[trading]     &lt;span class="c"&gt;# + trading module&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os[voice]       &lt;span class="c"&gt;# + voice synthesis&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os[vector]      &lt;span class="c"&gt;# + LanceDB/ChromaDB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each extension is an &lt;code&gt;EideticExtension&lt;/code&gt; subclass that registers its own commands, skills, and schedules. If one extension fails to load, the rest keep working. This was essential for community contributions — nobody should have to understand the trading module to add a documentation tool.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Why AST Security Scanning (Not Just Sandboxing)
&lt;/h3&gt;

&lt;p&gt;With 160+ community skills, someone will eventually write code that does something dangerous — intentionally or not. Sandboxing catches runtime problems (infinite loops, memory bombs, file access). But it doesn't catch &lt;em&gt;intent&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The AST scanner reads the code's structure before execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BLOCK&lt;/strong&gt; — &lt;code&gt;os.system()&lt;/code&gt;, &lt;code&gt;subprocess.call()&lt;/code&gt;, network access, file deletion. Hard-stopped, never executes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WARN&lt;/strong&gt; — Dynamic imports, eval/exec, broad file access. Logged, requires approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INFO&lt;/strong&gt; — External library imports, vault file reads. Noted but allowed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is defense in depth. The scanner catches dangerous patterns &lt;em&gt;before&lt;/em&gt; the sandbox even starts. Two independent layers, each with different detection strengths.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Fact Extraction (Not Raw Transcript Storage)
&lt;/h3&gt;

&lt;p&gt;v1 through v3 stored raw session transcripts. Every conversation, verbatim. This caused two problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context bloat&lt;/strong&gt; — Conversations are full of noise. False starts, corrections, "actually wait, let me rethink that." Embedding all of this pollutes search results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redundancy&lt;/strong&gt; — The same decision gets discussed across multiple sessions. You end up with five chunks saying the same thing in slightly different words.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;v4.0 introduced Mem0-style fact extraction. Instead of storing "we discussed authentication and decided to use JWT tokens because...", the system extracts: &lt;code&gt;"Paul chose JWT tokens for authentication (decided 2026-05-15, reason: stateless, no session DB needed)"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each fact gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cosine similarity comparison against existing facts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate detection&lt;/strong&gt; — if the fact already exists, bump its access count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contradiction handling&lt;/strong&gt; — if the new fact contradicts an old one, supersede it (mark old as inactive)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge logic&lt;/strong&gt; — if the new fact extends an old one, combine them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reduced context bloat dramatically. The system stores &lt;em&gt;decisions&lt;/em&gt;, not &lt;em&gt;discussions&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Memory Decay (Not Permanent Storage)
&lt;/h3&gt;

&lt;p&gt;Not all facts are equally relevant forever. "Paul prefers dark mode" is permanent. "The deploy target is staging-3" is temporary. Without decay, stale facts accumulate and pollute active reasoning.&lt;/p&gt;

&lt;p&gt;The retention model: &lt;code&gt;P(M) = e^(-λt) · (1 + βf)&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;λ = temporal decay rate&lt;/li&gt;
&lt;li&gt;t = time since last access&lt;/li&gt;
&lt;li&gt;f = access frequency&lt;/li&gt;
&lt;li&gt;β = reinforcement coefficient&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frequently accessed facts stay hot. Old, unreinforced facts decay toward deactivation. The sleeptime daemon runs this scoring while you're offline, pruning stale context automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Channel Adapters (Not Terminal-Only)
&lt;/h3&gt;

&lt;p&gt;A personal AI OS that only works when you're at your desk is half a solution. The channel adapter framework lets you query your knowledge base from Slack or Telegram. The system runs as a local daemon, receives messages, routes them through RAG search, and sends back answers.&lt;/p&gt;

&lt;p&gt;This was directly inspired by Letta's custom channels architecture. The key insight: decouple the intelligence from the interface. The same RAG pipeline serves the CLI, the dashboard, the Obsidian plugin, and messaging apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It's Going: v5.0
&lt;/h2&gt;

&lt;p&gt;A competitive analysis against Letta ($10M funded), Mem0 ($24M Series A), and Nucleus MCP revealed two gaps between "personal tool" and "enterprise platform": &lt;strong&gt;verification&lt;/strong&gt; and &lt;strong&gt;provenance&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Trust Problem
&lt;/h3&gt;

&lt;p&gt;When an AI agent executes code autonomously, the question isn't "can it do the task?" It's "can you &lt;em&gt;prove&lt;/em&gt; it did the task correctly?"&lt;/p&gt;

&lt;p&gt;In regulated industries — finance, healthcare, government — every autonomous action needs a tamper-evident audit trail. Our JSONL log captures everything, but anyone with filesystem access can modify it after the fact. And for code execution: we check for &lt;em&gt;danger&lt;/em&gt; (AST scanning), but we don't verify &lt;em&gt;correctness&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured Verification Gates (#29)
&lt;/h3&gt;

&lt;p&gt;A 5-tier pipeline that runs before any autonomous execution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SYNTAX&lt;/strong&gt; — AST parse, catch errors before anything runs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IMPORTS&lt;/strong&gt; — Verify dependencies resolve, cross-reference security block list&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TESTS&lt;/strong&gt; — If tests exist for the module, run them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RUNTIME&lt;/strong&gt; — Execute in sandbox, capture output and resource usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DIFF&lt;/strong&gt; — Show what changed, flag unexpected modifications
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Code/Skill ──► SYNTAX ──► IMPORTS ──► TESTS ──► RUNTIME ──► DIFF ──► ✅ Execute
                 │           │          │          │          │
                 ▼           ▼          ▼          ▼          ▼
              BLOCK?      BLOCK?     FAIL?     CRASH?    UNEXPECTED?
                 │           │          │          │          │
                 └───────────┴──────────┴──────────┴──────────┘
                                    │
                                 🛑 STOP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each tier produces a typed result. Execution stops on the first BLOCK-level failure. Every result feeds into the audit trail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cryptographic Audit Signatures (#30)
&lt;/h3&gt;

&lt;p&gt;Ed25519 signatures on every audit trail entry, with a SHA-256 hash chain linking each entry to the previous one. If any entry is modified after creation, the chain breaks and verification fails.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entry 1          Entry 2          Entry 3
┌──────────┐    ┌──────────┐    ┌──────────┐
│ action   │    │ action   │    │ action   │
│ timestamp│    │ timestamp│    │ timestamp│
│ prev: ∅  │───►│ prev: h1 │───►│ prev: h2 │
│ sig: Ed25│    │ sig: Ed25│    │ sig: Ed25│
└──────────┘    └──────────┘    └──────────┘
   hash=h1         hash=h2         hash=h3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turns the audit trail from "a log file" into "a cryptographic proof of execution history." Supports SOC2, EU DORA, and MAS TRM without any cloud service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tiered Memory (#31)
&lt;/h3&gt;

&lt;p&gt;Moving from a flat vector store to Core (hot context) / Recall (recent cache) / Archival (cold storage). The agent decides what stays active vs. what gets archived, using memory decay scoring to make informed decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Valkey Search (#32)
&lt;/h3&gt;

&lt;p&gt;High-performance search backend for multi-user deployments where retrieval latency matters. Keeps SQLite-vec as the zero-config default for personal use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy
&lt;/h2&gt;

&lt;p&gt;Every decision in Eidetic OS comes back to three principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Local-first&lt;/strong&gt; — Your data never leaves your machine unless you explicitly send it somewhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-readable&lt;/strong&gt; — Every piece of state is inspectable in a text editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive complexity&lt;/strong&gt; — Works with zero config out of the box, scales to enterprise with opt-in features&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI agent space is moving fast. Letta and Mem0 have venture funding and full teams. What we have is a different philosophy: your AI's memory belongs to you, runs on your hardware, and produces verifiable proof of what it did.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os
eidetic init
eidetic doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;GitHub: &lt;a href="https://github.com/paulholland511/eidetic-os" rel="noopener noreferrer"&gt;paulholland511/eidetic-os&lt;/a&gt;&lt;br&gt;
PyPI: &lt;a href="https://pypi.org/project/eidetic-os/" rel="noopener noreferrer"&gt;eidetic-os&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;v5.0 features are being built right now. Star the repo if you want to follow along.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is the second post in my series on building Eidetic OS. The first post covers the &lt;a href="https://dev.to/paulholland511/how-i-built-a-personal-ai-operating-system-with-claude-python-and-local-llms-56e2"&gt;full feature set and comparison tables&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Eidetic OS — How I Built a Personal AI Operating System That Never Forgets</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. I'd spend an hour explaining my project structure, my coding preferences, my infrastructure setup — and the next session started from zero. So I built a system that fixes that permanently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eidetic OS&lt;/strong&gt; (formerly Atlas OS) is an open-source personal AI operating system that wraps Claude Cowork and Claude Code with persistent memory, hybrid RAG search, 160+ installable skills, scheduled automation pipelines, a full web dashboard, and pluggable backends for both LLMs and vector databases. It turns a stateless chatbot into something that remembers everything, learns from every interaction, and works autonomously while you sleep.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why "Eidetic"?&lt;/strong&gt; The word means having perfect, photographic memory recall — the ability to remember everything you've ever seen or experienced with total clarity. That's exactly what this system does for your AI. We renamed from Atlas OS to avoid namespace collisions with the Windows debloater project (20.8K GitHub stars) and Fluidstack's bare-metal infrastructure OS. The old name buried us in search results. "Eidetic" is unique, memorable, and communicates exactly what the system does: &lt;em&gt;your AI never forgets.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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 eidetic-os&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: AI Amnesia
&lt;/h2&gt;

&lt;p&gt;If you've spent any time with Claude, ChatGPT, or any conversational AI, you've hit this wall. You build up context over a long session — your project architecture, your preferences, your ongoing decisions — and then the conversation ends. Next time, you start from scratch.&lt;/p&gt;

&lt;p&gt;Some tools try to solve this with conversation history. But raw conversation logs are a terrible memory format. They're full of false starts, corrections, tangents, and redundancy. Searching through thousands of lines of dialogue to find that one architectural decision you made three weeks ago? Painful.&lt;/p&gt;

&lt;p&gt;I wanted something different: a system where every conversation automatically becomes part of a searchable, structured knowledge base. Where the AI can instantly recall not just what we discussed, but the &lt;em&gt;decisions&lt;/em&gt; we made and &lt;em&gt;why&lt;/em&gt;. Where background processes keep the knowledge fresh, indexed, and connected.&lt;/p&gt;

&lt;p&gt;That's what Eidetic OS does.&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;┌──────────────────────────────────────────────────────────┐
│                      eidetic CLI                          │
│   init · doctor · search · embed · dashboard · skills     │
├──────────┬──────────┬───────────┬────────────────────────┤
│  Vault   │   RAG    │  Skills   │   LLM Backends         │
│  Parser  │  Engine  │  160+     │   LM Studio            │
│  Git Sync│  SQLite  │  Market-  │   Ollama               │
│  Session │  BM25+Vec│  place    │   llama.cpp            │
│  Capture │  RRF     │  MCP      │   OpenAI-compatible    │
│  Locking │  Rerank  │  Registry │   Auto-detect          │
├──────────┼──────────┼───────────┼────────────────────────┤
│  Exten-  │ Security │  Vector   │   Dashboard            │
│  sions   │ AST Scan │  Backends │   Flask + D3.js        │
│  Plug-   │ Sandbox  │  SQLite   │   7 Panels             │
│  gable   │ Audit    │  LanceDB  │   Knowledge Graph      │
│  Fault-  │ Trail    │  ChromaDB │   Real-time Stats      │
│  tolerant│ JSONL    │  Abstract │   Dark Theme           │
├──────────┴──────────┴───────────┴────────────────────────┤
│               Obsidian Markdown Vault                     │
│        (your files, your machine, git-versioned)          │
└──────────────────────────────────────────────────────────┘
&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 with YAML frontmatter. History is plain git — every change is a commit. Everything is diffable, portable, and yours.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works: The Memory Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Session Capture
&lt;/h3&gt;

&lt;p&gt;Every Claude Cowork conversation gets saved as a structured markdown note in your Obsidian vault. This happens automatically, twice daily via scheduled tasks. Each captured session includes a summary of what was discussed, key decisions and action items, files that were created or modified, code snippets and commands that were run, and YAML frontmatter with timestamps, tags, and metadata.&lt;/p&gt;

&lt;p&gt;The capture process strips noise — repeated prompts, error messages, verbose tool output — and preserves signal. The result is a clean, readable note that you can browse in Obsidian like any other document.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Semantic Chunking &amp;amp; Embedding
&lt;/h3&gt;

&lt;p&gt;Raw markdown files aren't searchable by meaning. So the RAG pipeline breaks every document into semantically coherent chunks — not by fixed character count (which splits mid-sentence), but by detecting topic boundaries using heading structure, paragraph breaks, and content similarity.&lt;/p&gt;

&lt;p&gt;Each chunk gets an embedding vector (via your local LLM or any OpenAI-compatible endpoint), a BM25 term frequency index, TF-IDF weights for reranking, and metadata linking back to the source file, heading, and position.&lt;/p&gt;

&lt;p&gt;The embedding runs incrementally. Changed files get re-chunked and re-embedded. Unchanged files are skipped. A full vault re-embed of ~2,000 files takes about 15 minutes on a local LM Studio instance with Nomic embeddings; incremental updates take seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Hybrid Search with Reciprocal Rank Fusion
&lt;/h3&gt;

&lt;p&gt;This is the core of the RAG engine, and the single biggest quality improvement I made:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query: "What vector database did we choose and why?"
         │
         ├──► BM25 Keyword Search
         │    Scores every chunk by exact term frequency
         │    Finds: chunks containing "vector", "database", "choose"
         │
         ├──► Vector Cosine Search (sqlite-vec)
         │    Finds semantically similar chunks
         │    Finds: chunks about "embedding storage decisions"
         │
         ├──► Reciprocal Rank Fusion (RRF)
         │    Merges both ranked lists with k=60
         │    Prevents either method from dominating
         │
         └──► TF-IDF Reranking
              Refines the top-N results
              Boosts chunks with rare, query-specific terms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why not just use embeddings? Because pure vector search misses exact matches. If you search for "sqlite-vec", embedding search might return results about "vector databases" in general but miss the specific chunk where you named the library. BM25 catches those exact hits. The fusion ensures you get both precision and recall.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Knowledge Graph
&lt;/h3&gt;

&lt;p&gt;Entity relationships are extracted from your vault and stored as a directed graph. People, projects, technologies, and decisions become nodes; their interactions become edges. The dashboard renders this as a D3.js force-directed graph, letting you visually explore how concepts connect across your knowledge base.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Extension Architecture (v3.0)
&lt;/h2&gt;

&lt;p&gt;In v3.0, I ripped apart the monolithic CLI and rebuilt it as a pluggable extension system.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;The original &lt;code&gt;cli.py&lt;/code&gt; was a 1,500-line monster. Trading commands, voice synthesis, job tracking — all tangled together. Every user got every feature whether they wanted it or not.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;Every feature module is now an &lt;strong&gt;extension&lt;/strong&gt; — a self-contained Python package that registers itself via setuptools entry-points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;eidetic_os.extensions.base&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;EideticExtension&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TradingExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EideticExtension&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trading&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register_commands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nd"&gt;@app.command&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;trade_report&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate a trading analysis report.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
            &lt;span class="c1"&gt;# Your trading logic here
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register_skills&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;crypto-analysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;market-briefing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register_schedules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;morning-briefing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cron&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0 7 * * *&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install only what you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os              &lt;span class="c"&gt;# Core system&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os[trading]     &lt;span class="c"&gt;# + trading extension&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os[voice]       &lt;span class="c"&gt;# + voice synthesis&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os[vector]      &lt;span class="c"&gt;# + LanceDB/ChromaDB backends&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  MCP Skills: Every Skill Is a Server
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol (MCP) is how modern AI tools communicate. In Eidetic OS, every skill in the marketplace automatically becomes an MCP server.&lt;/p&gt;

&lt;p&gt;Drop a &lt;code&gt;SKILL.md&lt;/code&gt; into a directory — it describes what the skill does, its parameters, and its execution logic. The MCP skill wrapper reads the markdown, generates a JSON-RPC tool definition, and serves it over stdio or HTTP transport. Any MCP-compatible client can discover and invoke it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eidetic skills list                              &lt;span class="c"&gt;# List available skills&lt;/span&gt;
eidetic skills run security-audit &lt;span class="nt"&gt;--target&lt;/span&gt; ./app &lt;span class="c"&gt;# Run a skill&lt;/span&gt;
eidetic mcp serve                                &lt;span class="c"&gt;# Start the MCP server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The marketplace currently has 160+ skills spanning security auditing, DevOps automation, frontend/backend engineering, data analysis, document generation, and business tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security: Because Autonomous Code Execution Is Dangerous
&lt;/h2&gt;

&lt;p&gt;Letting an AI agent run arbitrary code on your machine is terrifying. Eidetic OS takes this seriously with three layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1: AST Static Analysis&lt;/strong&gt; — Before any community skill executes, the code runs through an Abstract Syntax Tree analyser. It scans for dangerous operations (&lt;code&gt;os.system()&lt;/code&gt;, &lt;code&gt;subprocess.call()&lt;/code&gt;, network access, file deletion) and classifies them as BLOCK (hard-stopped), WARN (logged, requires approval), or INFO (noteworthy but safe).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2: Runtime Sandbox&lt;/strong&gt; — Even after static analysis, skills execute inside a sandboxed environment with timeout limits, memory caps, restricted filesystem access (vault-only), and no network access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3: Audit Trail&lt;/strong&gt; — Every autonomous action gets logged to an append-only JSONL file. The dashboard has a dedicated panel for browsing these logs with full timestamps and details.&lt;/p&gt;




&lt;h2&gt;
  
  
  Git Sync Hardening
&lt;/h2&gt;

&lt;p&gt;When you have multiple agents writing to the same vault simultaneously, git conflicts are inevitable. v3.0 adds safe merge strategies (&lt;code&gt;-X ours&lt;/code&gt; — vault-side always wins), YAML frontmatter validation before every commit, file-based locking with stale detection and automatic cleanup, and iCloud compatibility for Obsidian vaults synced through iCloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pluggable Vector Backends
&lt;/h2&gt;

&lt;p&gt;The default &lt;code&gt;sqlite-vec&lt;/code&gt; backend works great for personal use. But if you need more, swap backends without changing a line of indexing code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# In your config
&lt;/span&gt;&lt;span class="n"&gt;vector_backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lancedb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;# or "chromadb" or "sqlite" (default)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three backends implement the same abstract &lt;code&gt;VectorBackend&lt;/code&gt; interface. Your RAG pipeline doesn't know or care which one is running underneath.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pluggable LLM Backends
&lt;/h2&gt;

&lt;p&gt;Eidetic OS auto-detects whatever local LLM server you're running — LM Studio, Ollama, llama.cpp, or any OpenAI-compatible API. No cloud dependency. No API keys required. Everything runs on your hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dashboard
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;eidetic dashboard&lt;/code&gt; launches a Flask web app with seven panels: System Health (vault size, embedding coverage, sync status), Audit Trail (browse every autonomous action), Scheduled Tasks (view and manage automated pipelines), Skills (browse 160+ marketplace skills), Vector Store (embedding statistics, chunk distribution), RAG Search (test queries with result explanations), and Knowledge Graph (D3.js force-directed entity visualisation).&lt;/p&gt;

&lt;p&gt;Dark theme with slate/green accents. Server-side rendered — no npm, no build step, no React.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Compares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Eidetic OS&lt;/th&gt;
&lt;th&gt;Letta (MemGPT)&lt;/th&gt;
&lt;th&gt;Mem0&lt;/th&gt;
&lt;th&gt;Khoj&lt;/th&gt;
&lt;th&gt;gAIOS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Markdown vault + hybrid RAG&lt;/td&gt;
&lt;td&gt;Git-backed virtual FS&lt;/td&gt;
&lt;td&gt;Vector + graph fact store&lt;/td&gt;
&lt;td&gt;TF-IDF + semantic&lt;/td&gt;
&lt;td&gt;System prompts + wiki&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consolidation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scheduled pipeline + chunking&lt;/td&gt;
&lt;td&gt;"Sleeptime" background merging&lt;/td&gt;
&lt;td&gt;Event-based fact extraction&lt;/td&gt;
&lt;td&gt;Incremental indexing&lt;/td&gt;
&lt;td&gt;Manual CLI tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vector Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQLite-vec / LanceDB / ChromaDB&lt;/td&gt;
&lt;td&gt;Supabase (pgvector)&lt;/td&gt;
&lt;td&gt;Qdrant, Neo4j, Milvus&lt;/td&gt;
&lt;td&gt;In-memory + local&lt;/td&gt;
&lt;td&gt;Filesystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AST scanner + sandbox + audit&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pluggable entry-points + MCP&lt;/td&gt;
&lt;td&gt;Parent-subagent worktrees&lt;/td&gt;
&lt;td&gt;Thread-linked agents&lt;/td&gt;
&lt;td&gt;Multi-agent workers&lt;/td&gt;
&lt;td&gt;Python tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local-First&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (fully offline)&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No (cloud required)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM Backends&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LM Studio, Ollama, llama.cpp, OpenAI&lt;/td&gt;
&lt;td&gt;OpenAI, Anthropic&lt;/td&gt;
&lt;td&gt;Various cloud&lt;/td&gt;
&lt;td&gt;OpenAI, Ollama&lt;/td&gt;
&lt;td&gt;Claude Code only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flask + D3.js (7 panels)&lt;/td&gt;
&lt;td&gt;Web UI&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Web UI&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;160+ marketplace&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;/wiki tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;&lt;strong&gt;7:00 AM&lt;/strong&gt; — Morning briefing pipeline fires. Scans the vault, checks health, compiles a summary, emails it to you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Throughout the day&lt;/strong&gt; — Every Cowork session is captured automatically. Architecture decisions, debug sessions, planning — all preserved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any time&lt;/strong&gt; — Search your vault: "What did we decide about authentication?" Hybrid RAG returns the exact chunk with reasoning preserved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6:00 PM&lt;/strong&gt; — Evening session capture. Another batch of conversations preserved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overnight&lt;/strong&gt; — Embedding pipeline processes new files. Knowledge graph updates. Tomorrow's briefing compiles.&lt;/p&gt;

&lt;p&gt;The 17+ automated pipelines include twice-daily session capture, incremental RAG indexing, morning email briefings, knowledge graph rebuilds, vault health checks, git sync and commit, trading research modules (optional), and audit trail rotation.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;650+ tests&lt;/strong&gt;, CI/CD via GitHub Actions with OIDC trusted PyPI publishing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;160+ installable skills&lt;/strong&gt; with marketplace, registry, and MCP server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 pluggable vector backends&lt;/strong&gt; — SQLite-vec, LanceDB, ChromaDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 LLM backends&lt;/strong&gt; — LM Studio, Ollama, llama.cpp, OpenAI-compatible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7-panel dashboard&lt;/strong&gt; with D3.js knowledge graph&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;17+ automated pipelines&lt;/strong&gt; on configurable schedules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Append-only JSONL audit trail&lt;/strong&gt; for every action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AST security scanner&lt;/strong&gt; with BLOCK/WARN/INFO severities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git sync hardening&lt;/strong&gt; with safe merge, file locking, frontmatter validation&lt;/li&gt;
&lt;li&gt;MIT licensed, Docker support, Python 3.9+&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; Without persistent memory, you're rebuilding context every session. This is the fundamental problem that makes all AI assistants feel disposable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hybrid search is worth the complexity.&lt;/strong&gt; BM25 + vector + RRF + TF-IDF was the single biggest quality improvement. Pure embedding search sounds elegant but fails on exact matches.&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 it works offline and never leaks data. But you're managing your own infrastructure.&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; Free versioning, branching, conflict detection. v3.0's hardening made concurrent access reliable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Names matter more than you think.&lt;/strong&gt; "Atlas OS" collided with a 20K-star Windows project. Every search result — buried. Rebranding was painful (176 files) but necessary. Pick a unique name from day one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security can't be an afterthought.&lt;/strong&gt; The moment you let an AI execute code autonomously, you need static analysis, sandboxing, and audit logging. From the start.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What's Next: v4.0 Roadmap
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;#22 — Mem0-style Fact Extraction&lt;/strong&gt; — Extract discrete facts from conversations instead of storing raw transcripts. Deduplicate against existing memory. Estimated 80% context reduction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#23 — Sleeptime Consolidation Daemon&lt;/strong&gt; — Background process that compresses and synthesises dialogue logs while you're offline. Resolves contradictions, merges related facts, prunes stale info.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#24 — Native Obsidian Plugin&lt;/strong&gt; — Search, manage, and visualise your memory index directly inside Obsidian. Runs against the local server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#25 — Interactive Setup Wizard&lt;/strong&gt; — Guided CLI interview that auto-detects LLM backends, maps endpoints, configures vault location, profiles your preferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#26 — Channel Adapters&lt;/strong&gt; — Query your knowledge base from Slack or Telegram. System runs as a local daemon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#27 — Memory Decay Scoring&lt;/strong&gt; — Time-weighted relevance. Recent memories boosted, stale ones decay. Prevents old context from polluting active reasoning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;eidetic-os         &lt;span class="c"&gt;# Install&lt;/span&gt;
eidetic init                   &lt;span class="c"&gt;# Initialise vault + detect LLMs&lt;/span&gt;
eidetic doctor                 &lt;span class="c"&gt;# Check system health&lt;/span&gt;
eidetic embed                  &lt;span class="c"&gt;# Index your vault&lt;/span&gt;
eidetic search &lt;span class="s2"&gt;"auth decision"&lt;/span&gt; &lt;span class="c"&gt;# Search your knowledge&lt;/span&gt;
eidetic dashboard              &lt;span class="c"&gt;# Launch web dashboard&lt;/span&gt;
eidetic mcp serve              &lt;span class="c"&gt;# Start MCP server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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; (renaming to eidetic-os soon). Feedback, issues, and contributions welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Update (June 2026): Renamed from Atlas OS to Eidetic OS. Shipped v3.0 with extension architecture, MCP skills, security hardening, git sync hardening, and pluggable vector backends. Published v4.0 roadmap. What started as a simple session-capture script is now a complete platform for building a persistent, secure, local-first AI operating system.&lt;/em&gt;&lt;/p&gt;

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