<?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: R</title>
    <description>The latest articles on DEV Community by R (@heliosnova).</description>
    <link>https://dev.to/heliosnova</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%2F3826021%2F287cd905-1741-448e-bf1e-b49b6047894a.png</url>
      <title>DEV Community: R</title>
      <link>https://dev.to/heliosnova</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/heliosnova"/>
    <language>en</language>
    <item>
      <title>I built the personal AI that OpenClaw should have been</title>
      <dc:creator>R</dc:creator>
      <pubDate>Sun, 15 Mar 2026 23:37:38 +0000</pubDate>
      <link>https://dev.to/heliosnova/i-built-the-personal-ai-that-openclaw-should-have-been-1fgj</link>
      <guid>https://dev.to/heliosnova/i-built-the-personal-ai-that-openclaw-should-have-been-1fgj</guid>
      <description>&lt;p&gt;OpenClaw hit 216,000 GitHub stars in six weeks. It proved that millions of people want a personal AI assistant they can run themselves. Then came CVE-2026-25253. Then the ClawHavoc supply chain attack — 341 malicious skills, 9,000 compromised installations. Cisco and Palo Alto flagged it for a "lethal trifecta" of security risks: unrestricted tool access, no prompt injection detection, and plaintext credential storage.&lt;/p&gt;

&lt;p&gt;I'd been building my own self-hosted AI assistant for months. When OpenClaw blew up — and then blew up differently — I decided to open-source it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's called &lt;a href="https://github.com/HeliosNova/nova" rel="noopener noreferrer"&gt;Nova&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes Nova different
&lt;/h2&gt;

&lt;p&gt;Every AI assistant answers questions. Nova is the only one that &lt;em&gt;learns from getting them wrong&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "What's the capital of Australia?"
Nova: "Sydney"
You: "That's wrong, it's Canberra"

Nova detects the correction, extracts a lesson, generates a
DPO training pair, and updates its knowledge graph.

--- 3 months later, different conversation ---

You: "What's the capital of Australia?"
Nova: "Canberra"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not retrieval-augmented generation. That's not prompt engineering. The model itself got smarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The learning loop — how it actually works
&lt;/h2&gt;

&lt;p&gt;Nova has a 7-stage self-improvement pipeline. No other open-source project has anything close to this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1: Correction Detection
&lt;/h3&gt;

&lt;p&gt;When you say "actually, it's X" or "that's wrong," Nova's 2-stage detector fires:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Regex pre-filter&lt;/strong&gt; — 12 compiled patterns catch correction language ("actually," "that's wrong," "it should be," "remember that"). Fast, zero LLM cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM confirmation&lt;/strong&gt; — if the regex matches, Nova sends the exchange to the LLM with a structured extraction prompt. It pulls out: what was wrong, what's correct, and a one-sentence lesson.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why two stages? Because "actually, I was thinking about pasta tonight" isn't a correction. The regex catches candidates cheaply; the LLM filters false positives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: Lesson Storage
&lt;/h3&gt;

&lt;p&gt;Every confirmed correction becomes a lesson with four fields: &lt;code&gt;topic&lt;/code&gt;, &lt;code&gt;wrong_answer&lt;/code&gt;, &lt;code&gt;correct_answer&lt;/code&gt;, and &lt;code&gt;lesson_text&lt;/code&gt;. Lessons are stored in SQLite and indexed in ChromaDB for semantic search.&lt;/p&gt;

&lt;p&gt;On future queries, Nova retrieves relevant lessons using hybrid search (vector similarity + BM25 keyword matching + Reciprocal Rank Fusion) and injects them into the system prompt: &lt;em&gt;"You got this wrong before. The capital of Australia is Canberra, not Sydney."&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: DPO Training Data
&lt;/h3&gt;

&lt;p&gt;Every correction also generates a DPO (Direct Preference Optimization) training pair:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What's the capital of Australia?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chosen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The capital of Australia is Canberra."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rejected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The capital of Australia is Sydney."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-03-15T14:23:01"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These accumulate in a JSONL file. When enough pairs exist, Nova can fine-tune its own base model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 4: Automated Fine-Tuning
&lt;/h3&gt;

&lt;p&gt;Nova includes an 8-step automated pipeline (&lt;code&gt;scripts/finetune_auto.py&lt;/code&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check readiness (minimum 50 new DPO pairs)&lt;/li&gt;
&lt;li&gt;Load training data&lt;/li&gt;
&lt;li&gt;Stop Ollama (free GPU VRAM)&lt;/li&gt;
&lt;li&gt;Run DPO training via Unsloth&lt;/li&gt;
&lt;li&gt;Export to GGUF&lt;/li&gt;
&lt;li&gt;Restart Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A/B evaluation&lt;/strong&gt; — run holdout queries through both base and fine-tuned models, LLM-as-judge with randomized ordering to prevent position bias&lt;/li&gt;
&lt;li&gt;Deploy only if the fine-tuned model wins &amp;gt;50% with positive average preference&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model literally gets smarter. Not through bigger context windows or better prompts — through actual weight updates from your corrections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 5: Reflexion
&lt;/h3&gt;

&lt;p&gt;Not every failure is an explicit correction. Sometimes Nova gives a bad answer and you just move on. Reflexion catches these &lt;em&gt;silent failures&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Empty or very short responses to complex queries&lt;/li&gt;
&lt;li&gt;Tool loop exhaustion (used all 5 rounds without a clean answer)&lt;/li&gt;
&lt;li&gt;Error phrases in the response ("I couldn't," "failed to")&lt;/li&gt;
&lt;li&gt;Hallucination indicators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Failed responses are stored as reflexions. On future similar queries, Nova retrieves them as warnings: &lt;em&gt;"You failed on a similar query before. Here's what went wrong."&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 6: Curiosity Engine
&lt;/h3&gt;

&lt;p&gt;When Nova hedges ("I'm not sure"), admits ignorance, or a tool search returns nothing useful, the curiosity engine detects the knowledge gap and queues it for background research. A scheduled monitor (runs every hour) picks up the queue and researches the topics autonomously — results become knowledge graph triples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 7: Success Patterns
&lt;/h3&gt;

&lt;p&gt;High-quality responses (score &amp;gt;= 0.8) are stored as positive reinforcement. On similar future queries, Nova retrieves what worked: &lt;em&gt;"This approach worked well last time."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's under the hood
&lt;/h2&gt;

&lt;p&gt;Nova replaces a 9-node LangGraph pipeline with a single async generator function: &lt;code&gt;brain.think()&lt;/code&gt;. About 1,400 lines of Python that orchestrate 5 stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gather context&lt;/strong&gt; — load user facts, lessons, knowledge graph, reflexions, retrieved documents, skills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build messages&lt;/strong&gt; — assemble system prompt from 8 prioritized blocks with truncation budget&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate + tool loop&lt;/strong&gt; — up to 5 rounds of LLM generation + tool execution (21 built-in tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refine&lt;/strong&gt; — multi-round self-critique, plan coverage check, reflexion quality assessment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-process&lt;/strong&gt; — correction detection, fact extraction, KG updates, curiosity gap detection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No LangChain. No LangGraph. No agent frameworks. Just &lt;code&gt;async for event in think(query)&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security — built in, not bolted on
&lt;/h2&gt;

&lt;p&gt;After watching OpenClaw's security meltdown, I built Nova with the &lt;a href="https://genai.owasp.org/" rel="noopener noreferrer"&gt;OWASP Agentic Security Top 10&lt;/a&gt; in mind:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;th&gt;Nova&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unrestricted tool access&lt;/td&gt;
&lt;td&gt;All tools always available&lt;/td&gt;
&lt;td&gt;4-tier access control (sandboxed/standard/full/none)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt injection&lt;/td&gt;
&lt;td&gt;No detection&lt;/td&gt;
&lt;td&gt;4-category heuristic detection on all external content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential exposure&lt;/td&gt;
&lt;td&gt;Plaintext storage flagged&lt;/td&gt;
&lt;td&gt;No hardcoded secrets, &lt;code&gt;.env&lt;/code&gt; gitignored, HMAC skill signing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Training data poisoning&lt;/td&gt;
&lt;td&gt;N/A (no learning)&lt;/td&gt;
&lt;td&gt;Channel gating + confidence threshold for DPO pairs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container security&lt;/td&gt;
&lt;td&gt;Basic Docker&lt;/td&gt;
&lt;td&gt;Read-only root, no-new-privileges, all capabilities dropped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Bearer token + per-IP brute-force lockout (10 failures = 5min ban)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The prompt injection detector runs on every piece of external content — web search results, fetched pages, browser output, MCP tool results, imported skills. It checks 4 categories (role override, instruction injection, delimiter abuse, encoding tricks) with Unicode normalization and homoglyph detection. Suspicious content gets flagged, not stripped — the LLM sees it but is warned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python 3.11+, FastAPI, httpx, SQLite (WAL mode), ChromaDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM:&lt;/strong&gt; Ollama (default: Qwen3.5:27b) or OpenAI/Anthropic/Google&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React + TypeScript + Vite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search:&lt;/strong&gt; SearXNG (privacy-respecting, self-hosted)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Docker Compose (4 services)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; 1,443 across 57 files (including security offensive, stress, and behavioral tests)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No GPU? Use &lt;code&gt;docker-compose.cloud.yml&lt;/code&gt; — cloud handles inference, all data stays on your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temporal knowledge graph&lt;/strong&gt; — facts track when they were valid, with supersession chains and provenance. Query what was true at any point in time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14 proactive monitors&lt;/strong&gt; — scheduled domain research, self-reflection, lesson quizzes, skill validation, system maintenance. Nova works even when you're not talking to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 messaging channels&lt;/strong&gt; — Discord, Telegram, WhatsApp, Signal. All with phone-number allowlisting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP dual-mode&lt;/strong&gt; — consumes external tools (client) AND exposes its intelligence to Claude Code, Cursor, etc. (server). No other personal AI does both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;21 built-in tools&lt;/strong&gt; — web search, calculator, code execution, browser, email, calendar, webhooks, file ops, shell, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice&lt;/strong&gt; — local Whisper speech-to-text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop automation&lt;/strong&gt; — PyAutoGUI-based GUI control.&lt;/li&gt;
&lt;/ul&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;git clone https://github.com/HeliosNova/nova.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nova &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or one-liner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/HeliosNova/nova/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AGPL-3.0. Issues and PRs welcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/HeliosNova/nova" rel="noopener noreferrer"&gt;https://github.com/HeliosNova/nova&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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