<?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: M_N_Nik | Python &amp; Systems</title>
    <description>The latest articles on DEV Community by M_N_Nik | Python &amp; Systems (@eminsk).</description>
    <link>https://dev.to/eminsk</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%2F4114234%2Fe505cb46-57a5-4677-b19f-d6fb5323017d.png</url>
      <title>DEV Community: M_N_Nik | Python &amp; Systems</title>
      <link>https://dev.to/eminsk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eminsk"/>
    <language>en</language>
    <item>
      <title>Why 90% of Candlestick Patterns Fail: Building an Institutional AI Confluence Scanner in Python</title>
      <dc:creator>M_N_Nik | Python &amp; Systems</dc:creator>
      <pubDate>Fri, 11 Sep 2026 21:31:55 +0000</pubDate>
      <link>https://dev.to/eminsk/why-90-of-candlestick-patterns-fail-building-an-institutional-ai-confluence-scanner-in-python-3ep</link>
      <guid>https://dev.to/eminsk/why-90-of-candlestick-patterns-fail-building-an-institutional-ai-confluence-scanner-in-python-3ep</guid>
      <description>&lt;p&gt;If you have ever attempted to build an algorithmic trading bot in Python, you have almost certainly walked this exact path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You install &lt;code&gt;TA-Lib&lt;/code&gt; (after wrestling with C compilers, missing headers, and broken Windows wheels for an hour).&lt;/li&gt;
&lt;li&gt;You write a script scanning for classic candlestick patterns: &lt;strong&gt;Bullish Engulfing&lt;/strong&gt;, &lt;strong&gt;Hammer&lt;/strong&gt;, &lt;strong&gt;Morning Star&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You backtest it on your favorite stock or crypto pair.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; A disappointing, downward-sloping equity curve with a win rate hovering around 48% to 51%.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why? Because in institutional quantitative finance, &lt;strong&gt;naked candlestick patterns are treated as little more than random noise&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A "Hammer" appearing in the middle of a low-volume consolidation against a cascading 200 EMA downtrend has almost zero statistical edge. But that &lt;em&gt;same&lt;/em&gt; Hammer forming at the 200 EMA support, accompanied by a 2.5x Relative Volume (RVOL) spike and an oversold RSI (14) rebound, represents an institutional accumulation footprint.&lt;/p&gt;

&lt;p&gt;Today, I’m open-sourcing &lt;strong&gt;&lt;a href="https://github.com/eminsk/yfinance-ta-patterns" rel="noopener noreferrer"&gt;yfinance-ta-patterns&lt;/a&gt;&lt;/strong&gt; — an institutional-grade Python framework and CLI designed to bridge the gap between classic technical analysis, quantitative confluence modeling, and modern LLM-driven market intelligence.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Key Highlights of &lt;code&gt;yfinance-ta-patterns&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-C Build Installation by Default:&lt;/strong&gt; Includes a built-in vectorized pure-Python/NumPy engine for core candlestick patterns — install in seconds with &lt;code&gt;pip&lt;/code&gt; or &lt;code&gt;uv&lt;/code&gt; without needing C compilers or TA-Lib binaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full 61-Pattern Scanning:&lt;/strong&gt; Native TA-Lib acceleration supported with pre-built binary wheels for Windows x64 across Python 3.12, 3.13, 3.14, and Python 3.15 (including Free-Threaded No-GIL).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Factor AI Confluence Engine:&lt;/strong&gt; Calculates a deterministic quantitative confluence score ($0.0 - 1.0$) evaluating EMA trend alignment (20/50/200), zero-lookahead Relative Volume (RVOL), canonical Wilder's RSI (14), and ATR volatility expansion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Trade Setup Generator:&lt;/strong&gt; Instantly calculates Entry, ATR-based Invalidation Stop-Loss, and Multi-Tier Take-Profit targets (1.5R and 3.0R risk/reward).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM-Ready Market Intelligence:&lt;/strong&gt; Generates executive Markdown briefs and structured JSON payloads tailored for autonomous AI agents (Claude 3.5, GPT-4o, Gemini, DeepSeek, Ollama).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unbiased Quantitative Backtester:&lt;/strong&gt; Simulates realistic execution on the next bar open (&lt;code&gt;Open[i+1]&lt;/code&gt;), accounting for slippage, trading fees, FX currency conversion, and periodic Sharpe ratios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.8 to 3.15 &amp;amp; Free-Threaded (PEP 703 No-GIL) Ready:&lt;/strong&gt; Optimized for high-throughput multi-pair parallel scanning without GIL contention.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       [Raw Multi-Asset Data (yfinance)]
           Stocks | Crypto | Forex | Commodities
                       │
                       ▼
          ┌───────────────────────────┐
          │  Candle Normalizer &amp;amp; QA   │ ── Zero-lookahead, UTC 4h resample
          └───────────────────────────┘
                       │
                       ▼
          ┌───────────────────────────┐
          │ Pattern Recognition Engine│ ── 61 TA-Lib Patterns + Pure NumPy Engine
          └───────────────────────────┘
                       │
                       ▼
          ┌───────────────────────────┐
          │   AI Confluence Scorer    │ ── EMA 20/50/200 + RVOL + RSI + ATR
          └───────────────────────────┘
                       │
        ┌──────────────┴──────────────┐
        ▼                             ▼
┌──────────────────┐        ┌───────────────────────┐
│ Algorithmic Setups│        │  AI Agent Markdown    │
│ Entry, SL, TP1/2 │        │  Briefs &amp;amp; JSON Schema │
└──────────────────┘        └───────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ The Architecture: Quantitative Confluence vs. Naked Signals
&lt;/h2&gt;

&lt;p&gt;Traditional libraries treat a candlestick pattern as a binary boolean: &lt;code&gt;pattern detected: True/False&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;yfinance-ta-patterns&lt;/code&gt;, detecting a pattern is merely step one. The signal is then routed into the &lt;strong&gt;AIPatternScorer&lt;/strong&gt;, which computes a multi-dimensional quantitative confluence score based on four objective market factors:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Multi-EMA Trend Alignment
&lt;/h3&gt;

&lt;p&gt;The engine verifies alignment across three exponential moving averages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast EMA (20):&lt;/strong&gt; Short-term momentum&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium EMA (50):&lt;/strong&gt; Swing trend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow EMA (200):&lt;/strong&gt; Institutional macro regime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bullish patterns receive maximum scoring when price action trades above an ascending 200 EMA with confirmed 20/50 bullish alignment.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Relative Volume Surge (RVOL)
&lt;/h3&gt;

&lt;p&gt;Institutional accumulation leaves volume footprints. The scorer computes zero-lookahead Relative Volume ($RVOL = \frac{Volume_t}{SMA(Volume, 20)}$). Patterns accompanied by $RVOL &amp;gt; 1.8x$ receive significant scoring weight, filtering out low-liquidity false breaks.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Canonical Wilder's RSI (14) Momentum Exhaustion
&lt;/h3&gt;

&lt;p&gt;Using J. Welles Wilder's exact smoothing algorithm, the engine measures whether the reversal pattern occurs at momentum extremes (oversold $&amp;lt; 35$ for bullish reversals, overbought $&amp;gt; 65$ for bearish reversals) or exhibits momentum divergence.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Canonical Wilder's ATR (14) Volatility Expansion
&lt;/h3&gt;

&lt;p&gt;Evaluates whether the pattern candle body is dominant relative to recent Average True Range (filtering out doji indecision candles where decisive expansion was required).&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ 10-Second Quickstart
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yfinance-ta-patterns&lt;/code&gt; installs out-of-the-box with pure-Python fallbacks:&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;yfinance-ta-patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with &lt;code&gt;uv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv add yfinance-ta-patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Optional: Native TA-Lib acceleration can be installed via &lt;code&gt;pip install "yfinance-ta-patterns[talib]"&lt;/code&gt; or using pre-built wheels).&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Python Code Example: Live Market Scanner
&lt;/h3&gt;

&lt;p&gt;Here is how you scan multi-asset pairs, detect patterns, score confluence, and print an automated trade setup in just a few lines of 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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;yfinance_ta_patterns&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MarketDataLoader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PatternAnalyzer&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;yfinance_ta_patterns.ai.scorer&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIPatternScorer&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Fetch multi-asset data (Crypto, Stocks, Forex, Commodities)
&lt;/span&gt;&lt;span class="n"&gt;loader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MarketDataLoader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Detect candlestick patterns
&lt;/span&gt;&lt;span class="n"&gt;analyzer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PatternAnalyzer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pattern_signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analyzer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_patterns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_n_bars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Score confluence with the AI Quantitative Engine
&lt;/span&gt;&lt;span class="n"&gt;scorer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AIPatternScorer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pattern_signals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scorer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;score_pattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;pattern_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pattern&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;bar_idx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;signal_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;direction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Filter for high-confluence institutional setups
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confluence_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔥 HIGH CONFLUENCE SETUP: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pattern&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; on &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Confluence Score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confluence_score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; / 1.00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Trend Regime:     &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trend_alignment&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Relative Volume:  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rvol&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Wilder RSI (14):  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Automated Trade Setup
&lt;/span&gt;        &lt;span class="n"&gt;setup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trade_setup&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Entry:       $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;entry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Stop Loss:   $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stop_loss&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (ATR-based)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Take Profit: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;take_profit_1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (1.5R)&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;h2&gt;
  
  
  🤖 Generating LLM Market Briefs for AI Agents
&lt;/h2&gt;

&lt;p&gt;Modern trading architectures increasingly rely on LLM agents (Claude, GPT, Gemini, local Ollama models) for executive synthesis.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yfinance-ta-patterns&lt;/code&gt; includes an &lt;strong&gt;AI Market Analyst&lt;/strong&gt; module that transforms technical data into structured briefs and JSON schemas:&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;yfinance_ta_patterns.ai.analyst&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIMarketAnalyst&lt;/span&gt;

&lt;span class="n"&gt;analyst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AIMarketAnalyst&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;brief&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analyst&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_market_brief&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pattern_signals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BTC-USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Print executive Markdown brief ready for consumption by humans or AI agents
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brief&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output gives your LLM agent everything it needs — macroeconomic context, multi-timeframe trend status, pattern confluence, and risk parameters — without hallucinated indicators.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖥️ Instant CLI Execution (No Code Required)
&lt;/h2&gt;

&lt;p&gt;Prefer running from the terminal? &lt;code&gt;yfinance-ta-patterns&lt;/code&gt; includes a lightning-fast CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scan NVIDIA 1-hour candles with AI confluence&lt;/span&gt;
yftp &lt;span class="nt"&gt;--symbol&lt;/span&gt; NVDA &lt;span class="nt"&gt;--timeframe&lt;/span&gt; 1h &lt;span class="nt"&gt;--ai&lt;/span&gt;

&lt;span class="c"&gt;# Scan Bitcoin with all 61 patterns&lt;/span&gt;
yftp &lt;span class="nt"&gt;--symbol&lt;/span&gt; BTC-USD &lt;span class="nt"&gt;--all-patterns&lt;/span&gt; &lt;span class="nt"&gt;--timeframe&lt;/span&gt; 4h

&lt;span class="c"&gt;# Run directly without installing into your local environment via uvx:&lt;/span&gt;
uvx &lt;span class="nt"&gt;--from&lt;/span&gt; yfinance-ta-patterns yftp &lt;span class="nt"&gt;--symbol&lt;/span&gt; AAPL &lt;span class="nt"&gt;--timeframe&lt;/span&gt; 1d &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧵 Python 3.14 &amp;amp; Free-Threaded No-GIL (PEP 703) Ready
&lt;/h2&gt;

&lt;p&gt;High-frequency market scanners often monitor hundreds of currency pairs or crypto tickers simultaneously. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;yfinance-ta-patterns&lt;/code&gt; is designed for modern Python environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully compatible from &lt;strong&gt;Python 3.8 up to Python 3.15&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tested and verified on &lt;strong&gt;Free-Threaded CPython (3.13t, 3.14t, 3.15t No-GIL)&lt;/strong&gt;: Run parallel scanning threads across all CPU cores without Python GIL bottlenecks.&lt;/li&gt;
&lt;li&gt;Pre-built binary wheels available for Windows x64, macOS (Apple Silicon &amp;amp; Intel), and Linux.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Open Source Links &amp;amp; Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/yfinance-ta-patterns/" rel="noopener noreferrer"&gt;pypi.org/project/yfinance-ta-patterns&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/eminsk/yfinance-ta-patterns" rel="noopener noreferrer"&gt;github.com/eminsk/yfinance-ta-patterns&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're interested in algorithmic trading, quantitative finance, or building AI trading agents, give &lt;strong&gt;yfinance-ta-patterns&lt;/strong&gt; a try!&lt;/p&gt;

&lt;p&gt;If you find the project useful, please consider dropping a &lt;strong&gt;Star ⭐ on &lt;a href="https://github.com/eminsk/yfinance-ta-patterns" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; — it helps the project grow and reach more developers!&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5m8tc7506vgexwziutg.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5m8tc7506vgexwziutg.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>trading</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a JIT Compiler for AI Agents: How We Turned 30s LLM Chains into 0.1ms Deterministic Python</title>
      <dc:creator>M_N_Nik | Python &amp; Systems</dc:creator>
      <pubDate>Fri, 11 Sep 2026 19:34:01 +0000</pubDate>
      <link>https://dev.to/eminsk/i-built-a-jit-compiler-for-ai-agents-how-we-turned-30s-llm-chains-into-01ms-deterministic-python-51o2</link>
      <guid>https://dev.to/eminsk/i-built-a-jit-compiler-for-ai-agents-how-we-turned-30s-llm-chains-into-01ms-deterministic-python-51o2</guid>
      <description>&lt;p&gt;In 2026, AI agents have become the default paradigm for automating complex workflows: DevOps orchestration, customer support, database triage, and e-commerce transactions.&lt;/p&gt;

&lt;p&gt;Yet, every engineering team deploying autonomous agents in production eventually hits the same brick wall:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crippling Latency:&lt;/strong&gt; A standard 4-step tool chain (&lt;code&gt;think -&amp;gt; tool -&amp;gt; observe -&amp;gt; think&lt;/code&gt;) easily burns &lt;strong&gt;15 to 45 seconds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brutal API Bills:&lt;/strong&gt; Running that loop 50,000 times a day costs thousands of dollars every month for redundant reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flakiness &amp;amp; Non-Determinism:&lt;/strong&gt; Even with a 98% success rate per step, a 4-step chain has an ~8% failure rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redundant Inference:&lt;/strong&gt; Here is the unspoken truth of agent workflows: &lt;strong&gt;over 90% of recurring invocations execute the exact same sequence of tool calls&lt;/strong&gt;, differing only by input parameters (e.g., &lt;code&gt;user_id&lt;/code&gt;, &lt;code&gt;order_id&lt;/code&gt;, or &lt;code&gt;date&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why are we invoking massive 70-billion-parameter neural networks over HTTP dozens of times just to parse an ID and pass it into a database query?&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The Core Insight: Borrowing from V8 and PyTorch
&lt;/h2&gt;

&lt;p&gt;In computer science, this problem was solved decades ago:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript engines (Google V8):&lt;/strong&gt; Interpret dynamic code on the first run, profile hot execution paths, and compile them into native machine code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Learning (PyTorch &lt;code&gt;torch.compile&lt;/code&gt;):&lt;/strong&gt; Trace dynamic tensor operations and fuse them into deterministic CUDA/C++ kernels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What if we did the exact same thing for &lt;strong&gt;AI Agent Trajectories&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Today, I’m open-sourcing &lt;strong&gt;&lt;a href="https://github.com/eminsk/agentjit" rel="noopener noreferrer"&gt;AgentJIT&lt;/a&gt;&lt;/strong&gt; — a Just-In-Time trajectory compiler for AI agents that traces dynamic tool chains and compiles them into &lt;strong&gt;sub-millisecond, deterministic Python AST pipelines with zero runtime token cost&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       [Dynamic Agent Task]
                │
         (1st run / warmup)
                ▼
     ┌──────────────────────┐
     │   AgentJIT Tracer    │ ── Captures tool calls, data flow &amp;amp; variables
     └──────────────────────┘
                │
                ▼
     ┌──────────────────────┐
     │  DAG Flow Analyzer   │ ── Resolves dependencies &amp;amp; arithmetic expressions
     └──────────────────────┘
                │
                ▼
     ┌──────────────────────┐
     │  AST Code Generator  │ ── Synthesizes pure Python AST + Runtime Guards
     └──────────────────────┘
                │
                ▼
  ┌────────────────────────────┐
  │   Compiled JIT Pipeline    │ ──► Subsequent runs: &amp;lt; 0.1ms, $0 tokens!
  └────────────────────────────┘
                │
       (Guard failure? Deopt!)
                ▼
     [Fall back to LLM Agent]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;AgentJIT operates in three distinct phases:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tracing &amp;amp; Parameter Generalization
&lt;/h3&gt;

&lt;p&gt;When an agent decorated with &lt;code&gt;@jit&lt;/code&gt; runs for the first time, the &lt;code&gt;Tracer&lt;/code&gt; records every tool invocation, its inputs, outputs, and execution timings. It builds a directed acyclic graph (DAG) of the data flow, distinguishing between static parameters and dynamic runtime inputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AST Code Synthesis
&lt;/h3&gt;

&lt;p&gt;The compiler examines the trace and synthesizes a pure Python Abstract Syntax Tree (AST). It converts dynamic tool dispatching into hard-wired, type-checked Python function calls, resolving nested dictionaries and mathematical operators.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Speculative De-Optimization (Bailouts)
&lt;/h3&gt;

&lt;p&gt;What happens if the user inputs an anomalous value or unexpected format? &lt;/p&gt;

&lt;p&gt;AgentJIT automatically inserts &lt;strong&gt;Runtime Input Guards&lt;/strong&gt;. If any input violates the expected structure, the compiled pipeline immediately triggers a &lt;strong&gt;speculative bailout (de-optimization)&lt;/strong&gt;, gracefully falling back to the original LLM agent. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero crashes, zero regressions, pure speedup.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ 10-Second Quickstart
&lt;/h2&gt;

&lt;p&gt;AgentJIT is &lt;strong&gt;100% self-contained&lt;/strong&gt; in a single library with &lt;strong&gt;zero mandatory external dependencies&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&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;agentjit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(or &lt;code&gt;uv add agentjit&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Example
&lt;/h3&gt;

&lt;p&gt;Simply decorate your agent with &lt;code&gt;@jit&lt;/code&gt; and mark your tools with &lt;code&gt;@trace_tool&lt;/code&gt;:&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;agentjit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;jit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trace_tool&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Define your tools
&lt;/span&gt;&lt;span class="nd"&gt;@trace_tool&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;fetch_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;89.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&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;electronics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@trace_tool&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;calculate_vat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tax_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tax_rate&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@trace_tool&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;generate_invoice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&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;invoice_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INV-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="si"&gt;}&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;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;total_price&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Decorate your multi-step agent
&lt;/span&gt;&lt;span class="nd"&gt;@jit&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;checkout_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tax_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# This dynamic workflow could call an LLM (Claude, GPT, Gemini)
&lt;/span&gt;    &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_vat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;tax_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tax_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;generate_invoice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;total_price&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run 1: Warmup &amp;amp; Tracing (captures trajectory, compiles AST)
&lt;/span&gt;&lt;span class="n"&gt;order1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;checkout_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SKU-100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run 2+: Instant JIT execution (&amp;lt; 0.1ms, ZERO tokens consumed!)
&lt;/span&gt;&lt;span class="n"&gt;order2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;checkout_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SKU-200&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can even inspect the generated Python code at runtime:&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkout_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;source_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📊 Live Benchmark: 356x Speedup
&lt;/h2&gt;

&lt;p&gt;We ran a 100-iteration benchmark in Google Colab simulating an uncompiled multi-step LLM chain versus the compiled AgentJIT pipeline:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Uncompiled Agent&lt;/th&gt;
&lt;th&gt;AgentJIT Pipeline&lt;/th&gt;
&lt;th&gt;Advantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mean Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;37.21 ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.1044 ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;356.4x Faster&lt;/strong&gt; ⚡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token Cost (1k runs)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$7.50&lt;/code&gt; (2.5M tokens)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$0.00&lt;/code&gt; (0 tokens)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% Free&lt;/strong&gt; 💰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Determinism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~94%&lt;/code&gt; (LLM hallucinations)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;100.0%&lt;/code&gt; (Verified AST)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Rock-Solid&lt;/strong&gt; 🛡️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fallback Safety&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Automatic Speculative Deopt&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Zero Crashes&lt;/strong&gt; ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧵 Ready for Python 3.14 &amp;amp; Free-Threaded No-GIL (PEP 703)
&lt;/h2&gt;

&lt;p&gt;AgentJIT was architected with Python 3.13 and Python 3.14 in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Re-entrant Thread Safety:&lt;/strong&gt; All internal JIT compilation caches and pipeline registries use double-checked locking with &lt;code&gt;threading.Lock&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True Multi-Core Concurrency:&lt;/strong&gt; Fully tested on Free-Threaded CPython (&lt;code&gt;3.13t&lt;/code&gt; and &lt;code&gt;3.14t&lt;/code&gt;). You can spin up hundreds of concurrent agent threads without GIL contention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Tested:&lt;/strong&gt; 100% green CI matrix across both Ubuntu Linux and Windows runners for Python 3.10 through 3.14.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Try It Live in Google Colab
&lt;/h2&gt;

&lt;p&gt;You don't need to configure an environment or install dependencies locally. You can run the interactive demo and benchmark right now in your browser:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colab.research.google.com/github/eminsk/agentjit/blob/main/notebooks/AgentJIT_Interactive_Demo.ipynb" rel="noopener noreferrer"&gt;Launch Interactive Google Colab Demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Links &amp;amp; Community
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/agentjit/" rel="noopener noreferrer"&gt;pypi.org/project/agentjit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/eminsk/agentjit" rel="noopener noreferrer"&gt;github.com/eminsk/agentjit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;License:&lt;/strong&gt; Apache 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building autonomous agents in production and want to slash your latency and API costs, give &lt;strong&gt;AgentJIT&lt;/strong&gt; a spin!&lt;/p&gt;

&lt;p&gt;If you find the project interesting, please consider dropping a &lt;strong&gt;Star ⭐ on &lt;a href="https://github.com/eminsk/agentjit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; — it helps other developers discover the library!&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg4kayihreh4z8bz4zx8s.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg4kayihreh4z8bz4zx8s.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a 100% Private, Zero-Cloud Windows Recall in &lt;200KB — No NPU or Copilot+ PC Required</title>
      <dc:creator>M_N_Nik | Python &amp; Systems</dc:creator>
      <pubDate>Fri, 11 Sep 2026 17:55:31 +0000</pubDate>
      <link>https://dev.to/eminsk/i-built-a-100-private-zero-cloud-windows-recall-in-200kb-no-npu-or-copilot-pc-required-5dp9</link>
      <guid>https://dev.to/eminsk/i-built-a-100-private-zero-cloud-windows-recall-in-200kb-no-npu-or-copilot-pc-required-5dp9</guid>
      <description>&lt;p&gt;When Microsoft announced &lt;strong&gt;Windows Recall&lt;/strong&gt; — a feature that silently captures your screen every few seconds so you can search your past activity — the tech community had two immediate reactions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"The concept is actually super useful."&lt;/strong&gt; Everyone has closed a browser tab, lost a terminal command, or forgotten a link sent in a chat days ago.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The execution is a privacy and security disaster."&lt;/strong&gt; 

&lt;ul&gt;
&lt;li&gt;Unencrypted local storage vulnerable to malware.&lt;/li&gt;
&lt;li&gt;Cloud telemetry concerns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware lock-in:&lt;/strong&gt; Microsoft claimed you must buy a brand new &lt;strong&gt;$1,500+ Copilot+ PC&lt;/strong&gt; with a 40+ TOPS NPU chip just to search your own screen!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I refused to accept that a simple screen search engine requires gigabytes of OS bloat and specialized AI silicon. &lt;/p&gt;

&lt;p&gt;So, I built &lt;strong&gt;&lt;a href="https://github.com/eminsk/nanorecall" rel="noopener noreferrer"&gt;NanoRecall&lt;/a&gt;&lt;/strong&gt;: an open-source, 100% private, zero-cloud desktop memory engine in &lt;strong&gt;&amp;lt;200KB of code that runs on any standard CPU at sub-millisecond speeds&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖥️ The Interactive Dark-Mode Dashboard
&lt;/h2&gt;

&lt;p&gt;Here is what it looks like running locally on your PC (&lt;code&gt;nanorecall ui&lt;/code&gt;):&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5qodnbo6j7p0ffbuvx36.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5qodnbo6j7p0ffbuvx36.jpg" alt="NanoRecall Dashboard" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search Bar:&lt;/strong&gt; Type any natural query (&lt;em&gt;"sqlfluff pull request 8449 github"&lt;/em&gt;, &lt;em&gt;"docker crash error"&lt;/em&gt;, &lt;em&gt;"hotel reservation receipt"&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Timeline:&lt;/strong&gt; Scrub your day hour-by-hour (09:00 ➔ 14:00 ➔ 20:00) with visual activity heatmaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy Shield:&lt;/strong&gt; Active window detection that automatically shields password managers and private browsing tabs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Feature Comparison: Microsoft Recall vs. NanoRecall
&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;Microsoft Windows Recall&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;NanoRecall (This Project)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacy &amp;amp; Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unencrypted storage, telemetry risks&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% Local &amp;amp; Encrypted&lt;/strong&gt; (Zero bytes leave your PC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hardware Requirement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires &lt;strong&gt;Copilot+ PC ($1500+)&lt;/strong&gt; with 40+ TOPS NPU&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Runs on any standard Intel / AMD / ARM CPU&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vector Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Heavy proprietary runtime&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&lt;a href="https://github.com/eminsk/nanovector" rel="noopener noreferrer"&gt;NanoVector&lt;/a&gt;&lt;/strong&gt; (Pure C99 + AVX2, &amp;lt;120KB footprint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Variable (Cloud / NPU overhead)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.28 ms&lt;/strong&gt; (Sub-millisecond exact semantic search)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Password Protection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Records sensitive credentials and cards&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Privacy Shield&lt;/strong&gt;: Auto-ignores 1Password, Bitwarden, KeePass, Incognito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage Footprint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tens of gigabytes of raw frames&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Smart Frame Differencing&lt;/strong&gt;: Suppresses static frames (30–60 KB/frame)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Footprint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gigabytes of OS bloatware&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&amp;lt;200 KB pure codebase&lt;/strong&gt;, &amp;lt;25MB RAM idle, 0.1% CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏛️ Architecture: How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;NanoRecall is built with zero cloud dependencies using standard Python and bare-metal C99 SIMD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     ┌────────────────────────────────┐
                     │     Windows Desktop Display    │
                     └───────────────┬────────────────┘
                                     │
                        (Perceptual Diffing / 0.1% CPU)
                                     │
                     ┌───────────────▼────────────────┐
                     │    Native Win32 Screen Capture │
                     │  (GDI / BitBlt / DirectMemory) │
                     └───────────────┬────────────────┘
                                     │
                     ┌───────────────▼────────────────┐
                     │    Offline Text Extraction     │
                     │  (Windows.Media.Ocr / Local)   │
                     └───────────────┬────────────────┘
                                     │
                                     ├───────────────────────────────┐
                                     │ Text + Embeddings             │ Compressed Frame
                                     ▼                               ▼
                     ┌────────────────────────────────┐  ┌───────────────────────┐
                     │       NanoVector Core          │  │   Local Image Store   │
                     │  (C99 AVX2 + .nvec persistence)│  │   (WebP / 30-60 KB)   │
                     └───────────────┬────────────────┘  └───────────┬───────────┘
                                     │                               │
                                     └───────────────┬───────────────┘
                                                     ▼
                                     ┌────────────────────────────────┐
                                     │     Search &amp;amp; Recall Engine     │
                                     │   (CLI + Dark-Mode Dashboard)  │
                                     └────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Smart Perceptual Frame Differencing (0.1% Idle CPU)
&lt;/h3&gt;

&lt;p&gt;Instead of blindly capturing screenshots every 3 seconds and exhausting your SSD, NanoRecall calculates a fast 32x32 grayscale perceptual fingerprint. If the screen hasn't changed by at least 1.5% (reading, typing a note, or stepped away for coffee), capture is automatically skipped.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Built-in Privacy Shield
&lt;/h3&gt;

&lt;p&gt;Through Win32 API hooks (&lt;code&gt;GetForegroundWindow&lt;/code&gt;), NanoRecall constantly inspects the active window title and class. Whenever password managers (&lt;code&gt;1Password&lt;/code&gt;, &lt;code&gt;Bitwarden&lt;/code&gt;, &lt;code&gt;KeePassXC&lt;/code&gt;), private browsing windows (&lt;code&gt;Incognito&lt;/code&gt;, &lt;code&gt;InPrivate&lt;/code&gt;), or crypto wallets (&lt;code&gt;MetaMask&lt;/code&gt;, &lt;code&gt;Ledger&lt;/code&gt;) are focused, capture is &lt;strong&gt;instantly paused&lt;/strong&gt;. Sensitive tokens (&lt;code&gt;sk-...&lt;/code&gt; keys, credit cards) are redacted via regex before indexing.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Sub-Millisecond Search Powered by NanoVector
&lt;/h3&gt;

&lt;p&gt;For vector search, it directly utilizes &lt;strong&gt;&lt;a href="https://github.com/eminsk/nanovector" rel="noopener noreferrer"&gt;NanoVector&lt;/a&gt;&lt;/strong&gt;, a minimalist ~120KB C99 SIMD engine with AVX2 and ARM NEON unrolled kernels. Your entire desktop memory history is packed into a single binary &lt;code&gt;.nvec&lt;/code&gt; file that loads in milliseconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 60-Second Quickstart
&lt;/h2&gt;

&lt;p&gt;NanoRecall is packaged and published on PyPI. You can install and try it right now on Windows, Linux, or macOS:&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;nanorecall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Capture Your Current Screen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nanorecall capture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📸 Capturing desktop screen...
🔍 Extracting offline OCR text...
🧠 Indexing into NanoVector (Window: Active Window)...
✅ Indexed frame 2026-09-11_142315 (342 words, 98.4% change)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Search Anything from Your Past (CLI)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nanorecall search &lt;span class="s2"&gt;"github pull request sqlfluff"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔍 Search Query: 'github pull request sqlfluff' (1 results found in 0.28 ms)

#1 [98% Match] Google Chrome — sqlfluff pull request 8449 github
   🕒 Captured: 2026-09-11_142315
   📝 Text:     merged upstream/main to pull in CI fix and added StarRocks test cases...
   🖼️  File:     ~/.nanorecall/frames/2026-09-11_142315.webp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Launch the Local Web Dashboard
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nanorecall ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:8765&lt;/code&gt; in your browser to explore your visual timeline and search interactively!&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Try It in Your Browser (Google Colab)
&lt;/h2&gt;

&lt;p&gt;Don't want to install anything locally yet? Run the live interactive demo directly in Google Colab:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colab.research.google.com/github/eminsk/nanorecall/blob/main/notebooks/nanorecall_quickstart.ipynb" rel="noopener noreferrer"&gt;Open NanoRecall Quickstart in Google Colab&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Colab CPU Benchmark Results:
&lt;/h3&gt;

&lt;p&gt;Testing search latency over thousands of recorded desktop frames on a standard virtual CPU:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stored Frames ($N$)&lt;/th&gt;
&lt;th&gt;Search Latency&lt;/th&gt;
&lt;th&gt;Throughput (QPS)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;$N = 500$&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.023 ms (23 µs)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;44,014 QPS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;$N = 2,000$&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.071 ms (71 µs)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14,130 QPS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;$N = 10,000$&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.320 ms (320 µs)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3,128 QPS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even with &lt;strong&gt;10,000 recorded desktop screens&lt;/strong&gt;, search executes in &lt;strong&gt;under 1/3 of a millisecond&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Links &amp;amp; Open Source
&lt;/h2&gt;

&lt;p&gt;NanoRecall is 100% open source under the MIT license:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/eminsk/nanorecall" rel="noopener noreferrer"&gt;github.com/eminsk/nanorecall&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;PyPI Package:&lt;/strong&gt; &lt;a href="https://pypi.org/project/nanorecall/" rel="noopener noreferrer"&gt;pypi.org/project/nanorecall&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Core Vector Engine:&lt;/strong&gt; &lt;a href="https://github.com/eminsk/nanovector" rel="noopener noreferrer"&gt;github.com/eminsk/nanovector&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you believe software should be private, lightweight, and respect user autonomy, drop a ⭐ on GitHub and let me know what features you'd like to see 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0arwfm01vp1n03i5ajx.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0arwfm01vp1n03i5ajx.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built the SQLite of Vector Search in ~120KB of Pure C &amp; SIMD: 3,000x Faster Cold Starts and Zero Dependencies for AI Agents</title>
      <dc:creator>M_N_Nik | Python &amp; Systems</dc:creator>
      <pubDate>Fri, 11 Sep 2026 12:17:42 +0000</pubDate>
      <link>https://dev.to/eminsk/i-built-the-sqlite-of-vector-search-in-120kb-of-pure-c-simd-3000x-faster-cold-starts-and-zero-5elj</link>
      <guid>https://dev.to/eminsk/i-built-the-sqlite-of-vector-search-in-120kb-of-pure-c-simd-3000x-faster-cold-starts-and-zero-5elj</guid>
      <description>&lt;h1&gt;
  
  
  ⚡ I Built the SQLite of Vector Search in ~120KB of Pure C &amp;amp; SIMD
&lt;/h1&gt;

&lt;p&gt;If you're building LLM agents, local RAG systems, or CLI tools in Python today, you've likely faced the &lt;strong&gt;vector database dependency nightmare&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To store a few thousand embeddings from a conversation history or document chunks, standard tutorials tell you to &lt;code&gt;pip install chromadb&lt;/code&gt; or install FAISS.&lt;/p&gt;

&lt;p&gt;Here is what happens under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Over 35 transitive dependencies&lt;/strong&gt; are downloaded into your virtual environment (&lt;code&gt;pydantic&lt;/code&gt;, &lt;code&gt;onnxruntime&lt;/code&gt;, &lt;code&gt;tokenizers&lt;/code&gt;, &lt;code&gt;fastapi&lt;/code&gt;, &lt;code&gt;duckdb&lt;/code&gt;, &lt;code&gt;uvicorn&lt;/code&gt;, &lt;code&gt;grpcio&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The distribution package balloons past &lt;strong&gt;150 MB+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold Start Penalty:&lt;/strong&gt; Just typing &lt;code&gt;import chromadb&lt;/code&gt; takes &lt;strong&gt;1.5 to 2.5 seconds&lt;/strong&gt; before a single line of your actual code executes. If you run a CLI tool, a serverless AWS Lambda function, or an ephemeral Docker container, you pay this 2-second tax every single run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Small-to-Medium Scale Trap:&lt;/strong&gt; Over &lt;strong&gt;95% of AI agent workloads&lt;/strong&gt; store between 50 and 50,000 vectors (conversation turns, tool history, session memory). At this scale, hierarchical graph traversal (HNSW) incurs massive pointer chasing, cache thrashing, and non-deterministic approximate recall.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I asked myself: &lt;strong&gt;Why isn't there an SQLite equivalent for vector search?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A single, self-contained binary file. Zero external dependencies. Sub-millisecond import time. Single-file persistence (&lt;code&gt;.nvec&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/eminsk/nanovector" rel="noopener noreferrer"&gt;&lt;strong&gt;NanoVector&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ The Numbers: NanoVector vs ChromaDB vs FAISS
&lt;/h2&gt;

&lt;p&gt;Benchmarked on an &lt;strong&gt;Intel/AMD x86-64 CPU (AVX2+FMA)&lt;/strong&gt; with standard 384-dimensional embeddings (&lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; / sentence-transformers):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric / Feature&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;NanoVector&lt;/strong&gt; ⚡&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;ChromaDB&lt;/strong&gt; 🐢&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;FAISS&lt;/strong&gt; ⚖️&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wheel Download Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;38 KB&lt;/strong&gt; (~120 KB unpacked)&lt;/td&gt;
&lt;td&gt;~120 MB+&lt;/td&gt;
&lt;td&gt;~50 MB+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;External Dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 (Zero)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35+ packages&lt;/td&gt;
&lt;td&gt;OpenMP, BLAS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python Cold Import Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.6 ms&lt;/strong&gt; (🚀 &lt;strong&gt;3,000x faster&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;1,850 ms&lt;/td&gt;
&lt;td&gt;~120 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search Latency ($N=2,000$, 384D)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.13 ms&lt;/strong&gt; (7,478 QPS)&lt;/td&gt;
&lt;td&gt;8.2 ms&lt;/td&gt;
&lt;td&gt;0.22 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Batch Ingestion Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,414,000 vectors/sec&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~25,000 vectors/sec&lt;/td&gt;
&lt;td&gt;~400,000 vectors/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistence Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Single &lt;code&gt;.nvec&lt;/code&gt; binary file&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-dir SQLite + DuckDB&lt;/td&gt;
&lt;td&gt;Custom binary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero-Copy NumPy Buffer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes (Python Buffer Protocol)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No (copies memory)&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GIL Released During Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes (&lt;code&gt;Py_BEGIN_ALLOW_THREADS&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠️ How It Works: Bare-Metal Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Direct 8-Wide AVX2 &amp;amp; ARM NEON Vector Kernels
&lt;/h3&gt;

&lt;p&gt;Instead of relying on heavy linear algebra libraries (OpenBLAS, MKL) that incur function call dispatch overhead, NanoVector uses handcrafted SIMD kernels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AVX2+FMA (x86-64):&lt;/strong&gt; Processes 8 &lt;code&gt;float32&lt;/code&gt; elements per vector register cycle with 4-way loop unrolling (32 floats per iteration) directly in CPU L1/L2 cache.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ARM NEON (Apple Silicon M-series &amp;amp; Linux AArch64):&lt;/strong&gt; Uses 128-bit &lt;code&gt;float32x4_t&lt;/code&gt; registers with fused multiply-accumulates (&lt;code&gt;vmlaq_f32&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FASM x86-64 Edition:&lt;/strong&gt; Includes a standalone pure assembly implementation written in Flat Assembler for zero-C environments.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       Query Vector Q (1 x D)              Database Vector Matrix (N x D)
     [ q0 q1 q2 q3 q4 q5 q6 q7 ]           [ d0 d1 d2 d3 d4 d5 d6 d7 ] -&amp;gt; Vector 0
                                     x     [ d0 d1 d2 d3 d4 d5 d6 d7 ] -&amp;gt; Vector 1
                                           [ . . . . . . . . . . . . ]
                                           [ d0 d1 d2 d3 d4 d5 d6 d7 ] -&amp;gt; Vector N
                      │                                   │
                      └─────────────────┬─────────────────┘
                                        ▼
                   AVX2 Dot Product Accumulator (ymm0-ymm3)
                         Exact Cosine / L2 / IP Score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The 100% Deterministic Brute-Force Advantage
&lt;/h3&gt;

&lt;p&gt;At scale ($N &amp;lt; 50,000$), modern CPUs with 256-bit SIMD can compute dot products across the entire database in less than &lt;strong&gt;0.2 milliseconds&lt;/strong&gt;. &lt;br&gt;
Approximate Nearest Neighbor (ANN) algorithms like HNSW or IVF trade off accuracy for speed, but at $N &amp;lt; 50k$, the graph traversal overhead and random pointer jumps actually make HNSW &lt;strong&gt;slower&lt;/strong&gt; than sequential SIMD streaming from L2 cache!&lt;/p&gt;

&lt;p&gt;NanoVector provides &lt;strong&gt;100% exact, deterministic recall&lt;/strong&gt; with zero approximation errors.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. The &lt;code&gt;.nvec&lt;/code&gt; Single-File Storage Format
&lt;/h3&gt;

&lt;p&gt;Like SQLite's single &lt;code&gt;.db&lt;/code&gt; file, NanoVector serializes the vector matrix, vector IDs, and optional JSON metadata strings into a compact, atomic &lt;code&gt;.nvec&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Header: 32 bytes]  -&amp;gt; Magic 'NVEC', Version, Metric, Dim, Count
[Vectors: N * D * 4] -&amp;gt; Contiguous 32-byte aligned IEEE-754 floats
[String Offsets]    -&amp;gt; ID &amp;amp; Metadata index table
[Strings Data]      -&amp;gt; Packed UTF-8 strings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saving and reloading takes &lt;strong&gt;under 1 millisecond&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Quickstart: 30 Seconds to Long-Term Agent Memory
&lt;/h2&gt;

&lt;p&gt;Install via pip:&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;nanovector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Basic Vector Search
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize index (384D for sentence-transformers, 768D for BERT, 1536D for OpenAI)
&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cosine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add embeddings with metadata
&lt;/span&gt;&lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doc_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NanoVector Launch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eminsk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Search top-k
&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Meta: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Save to a single atomic file
&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory.nvec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Reload instantly
&lt;/span&gt;&lt;span class="n"&gt;loaded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory.nvec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Loaded &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loaded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; vectors in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loaded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;D!&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;h3&gt;
  
  
  2. Autonomous AI Agent Episodic Memory Pattern
&lt;/h3&gt;

&lt;p&gt;Here is how you give an LLM agent persistent memory without external database infrastructure:&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;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AgentMemory&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;__init__&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;filepath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_brain.nvec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;384&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;filepath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filepath&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;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cosine&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;remember&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;turn_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;assistant_reply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;assistant_reply&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;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;turn_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;meta&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;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&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;filepath&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;recall&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;query_embedding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&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;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage in your agent loop
&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentMemory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Recalls relevant past experiences in 0.15 milliseconds!
&lt;/span&gt;&lt;span class="n"&gt;memories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_task_embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Open Source &amp;amp; Community
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/eminsk/nanovector" rel="noopener noreferrer"&gt;https://github.com/eminsk/nanovector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/nanovector/" rel="noopener noreferrer"&gt;https://pypi.org/project/nanovector/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Google Colab Notebook:&lt;/strong&gt; &lt;a href="https://colab.research.google.com/github/eminsk/nanovector/blob/main/notebooks/nanovector_quickstart.ipynb" rel="noopener noreferrer"&gt;Open in Colab&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're tired of 200MB Docker images and 2-second cold imports for simple vector operations, give NanoVector a spin. ⭐ Star the project on GitHub if you believe in lightweight, bare-metal software!&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>I Built the SQLite of Vector Search in ~120KB of Pure C &amp; SIMD: 3,000x Faster Cold Starts and Zero Dependencies for AI Agents</title>
      <dc:creator>M_N_Nik | Python &amp; Systems</dc:creator>
      <pubDate>Fri, 11 Sep 2026 11:44:39 +0000</pubDate>
      <link>https://dev.to/eminsk/nanovector-v012-interactive-google-colab-support-python-39-compatibility-199k</link>
      <guid>https://dev.to/eminsk/nanovector-v012-interactive-google-colab-support-python-39-compatibility-199k</guid>
      <description>&lt;h1&gt;
  
  
  ⚡ I Built the SQLite of Vector Search in ~120KB of Pure C &amp;amp; SIMD
&lt;/h1&gt;

&lt;p&gt;If you're building LLM agents, local RAG systems, or CLI tools in Python today, you've likely faced the &lt;strong&gt;vector database dependency nightmare&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To store a few thousand embeddings from a conversation history or document chunks, standard tutorials tell you to &lt;code&gt;pip install chromadb&lt;/code&gt; or install FAISS.&lt;/p&gt;

&lt;p&gt;Here is what happens under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Over 35 transitive dependencies&lt;/strong&gt; are downloaded into your virtual environment (&lt;code&gt;pydantic&lt;/code&gt;, &lt;code&gt;onnxruntime&lt;/code&gt;, &lt;code&gt;tokenizers&lt;/code&gt;, &lt;code&gt;fastapi&lt;/code&gt;, &lt;code&gt;duckdb&lt;/code&gt;, &lt;code&gt;uvicorn&lt;/code&gt;, &lt;code&gt;grpcio&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The distribution package balloons past &lt;strong&gt;150 MB+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold Start Penalty:&lt;/strong&gt; Just typing &lt;code&gt;import chromadb&lt;/code&gt; takes &lt;strong&gt;1.5 to 2.5 seconds&lt;/strong&gt; before a single line of your actual code executes. If you run a CLI tool, a serverless AWS Lambda function, or an ephemeral Docker container, you pay this 2-second tax every single run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Small-to-Medium Scale Trap:&lt;/strong&gt; Over &lt;strong&gt;95% of AI agent workloads&lt;/strong&gt; store between 50 and 50,000 vectors (conversation turns, tool history, session memory). At this scale, hierarchical graph traversal (HNSW) incurs massive pointer chasing, cache thrashing, and non-deterministic approximate recall.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I asked myself: &lt;strong&gt;Why isn't there an SQLite equivalent for vector search?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A single, self-contained binary file. Zero external dependencies. Sub-millisecond import time. Single-file persistence (&lt;code&gt;.nvec&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/eminsk/nanovector" rel="noopener noreferrer"&gt;&lt;strong&gt;NanoVector&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ The Numbers: NanoVector vs ChromaDB vs FAISS
&lt;/h2&gt;

&lt;p&gt;Benchmarked on an &lt;strong&gt;Intel/AMD x86-64 CPU (AVX2+FMA)&lt;/strong&gt; with standard 384-dimensional embeddings (&lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; / sentence-transformers):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric / Feature&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;NanoVector&lt;/strong&gt; ⚡&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;ChromaDB&lt;/strong&gt; 🐢&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;FAISS&lt;/strong&gt; ⚖️&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wheel Download Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;38 KB&lt;/strong&gt; (~120 KB unpacked)&lt;/td&gt;
&lt;td&gt;~120 MB+&lt;/td&gt;
&lt;td&gt;~50 MB+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;External Dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 (Zero)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35+ packages&lt;/td&gt;
&lt;td&gt;OpenMP, BLAS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python Cold Import Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.6 ms&lt;/strong&gt; (🚀 &lt;strong&gt;3,000x faster&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;1,850 ms&lt;/td&gt;
&lt;td&gt;~120 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search Latency ($N=2,000$, 384D)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.13 ms&lt;/strong&gt; (7,478 QPS)&lt;/td&gt;
&lt;td&gt;8.2 ms&lt;/td&gt;
&lt;td&gt;0.22 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Batch Ingestion Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,414,000 vectors/sec&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~25,000 vectors/sec&lt;/td&gt;
&lt;td&gt;~400,000 vectors/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistence Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Single &lt;code&gt;.nvec&lt;/code&gt; binary file&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-dir SQLite + DuckDB&lt;/td&gt;
&lt;td&gt;Custom binary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero-Copy NumPy Buffer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes (Python Buffer Protocol)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No (copies memory)&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GIL Released During Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes (&lt;code&gt;Py_BEGIN_ALLOW_THREADS&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠️ How It Works: Bare-Metal Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Direct 8-Wide AVX2 &amp;amp; ARM NEON Vector Kernels
&lt;/h3&gt;

&lt;p&gt;Instead of relying on heavy linear algebra libraries (OpenBLAS, MKL) that incur function call dispatch overhead, NanoVector uses handcrafted SIMD kernels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AVX2+FMA (x86-64):&lt;/strong&gt; Processes 8 &lt;code&gt;float32&lt;/code&gt; elements per vector register cycle with 4-way loop unrolling (32 floats per iteration) directly in CPU L1/L2 cache.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ARM NEON (Apple Silicon M-series &amp;amp; Linux AArch64):&lt;/strong&gt; Uses 128-bit &lt;code&gt;float32x4_t&lt;/code&gt; registers with fused multiply-accumulates (&lt;code&gt;vmlaq_f32&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FASM x86-64 Edition:&lt;/strong&gt; Includes a standalone pure assembly implementation written in Flat Assembler for zero-C environments.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       Query Vector Q (1 x D)              Database Vector Matrix (N x D)
     [ q0 q1 q2 q3 q4 q5 q6 q7 ]           [ d0 d1 d2 d3 d4 d5 d6 d7 ] -&amp;gt; Vector 0
                                     x     [ d0 d1 d2 d3 d4 d5 d6 d7 ] -&amp;gt; Vector 1
                                           [ . . . . . . . . . . . . ]
                                           [ d0 d1 d2 d3 d4 d5 d6 d7 ] -&amp;gt; Vector N
                      │                                   │
                      └─────────────────┬─────────────────┘
                                        ▼
                   AVX2 Dot Product Accumulator (ymm0-ymm3)
                         Exact Cosine / L2 / IP Score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The 100% Deterministic Brute-Force Advantage
&lt;/h3&gt;

&lt;p&gt;At scale ($N &amp;lt; 50,000$), modern CPUs with 256-bit SIMD can compute dot products across the entire database in less than &lt;strong&gt;0.2 milliseconds&lt;/strong&gt;. &lt;br&gt;
Approximate Nearest Neighbor (ANN) algorithms like HNSW or IVF trade off accuracy for speed, but at $N &amp;lt; 50k$, the graph traversal overhead and random pointer jumps actually make HNSW &lt;strong&gt;slower&lt;/strong&gt; than sequential SIMD streaming from L2 cache!&lt;/p&gt;

&lt;p&gt;NanoVector provides &lt;strong&gt;100% exact, deterministic recall&lt;/strong&gt; with zero approximation errors.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. The &lt;code&gt;.nvec&lt;/code&gt; Single-File Storage Format
&lt;/h3&gt;

&lt;p&gt;Like SQLite's single &lt;code&gt;.db&lt;/code&gt; file, NanoVector serializes the vector matrix, vector IDs, and optional JSON metadata strings into a compact, atomic &lt;code&gt;.nvec&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Header: 32 bytes]  -&amp;gt; Magic 'NVEC', Version, Metric, Dim, Count
[Vectors: N * D * 4] -&amp;gt; Contiguous 32-byte aligned IEEE-754 floats
[String Offsets]    -&amp;gt; ID &amp;amp; Metadata index table
[Strings Data]      -&amp;gt; Packed UTF-8 strings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saving and reloading takes &lt;strong&gt;under 1 millisecond&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Quickstart: 30 Seconds to Long-Term Agent Memory
&lt;/h2&gt;

&lt;p&gt;Install via pip:&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;nanovector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Basic Vector Search
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize index (384D for sentence-transformers, 768D for BERT, 1536D for OpenAI)
&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cosine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add embeddings with metadata
&lt;/span&gt;&lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doc_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NanoVector Launch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eminsk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Search top-k
&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Meta: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Save to a single atomic file
&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory.nvec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Reload instantly
&lt;/span&gt;&lt;span class="n"&gt;loaded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory.nvec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Loaded &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loaded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; vectors in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loaded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;D!&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;h3&gt;
  
  
  2. Autonomous AI Agent Episodic Memory Pattern
&lt;/h3&gt;

&lt;p&gt;Here is how you give an LLM agent persistent memory without external database infrastructure:&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;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AgentMemory&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;__init__&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;filepath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_brain.nvec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;384&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;filepath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filepath&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;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;nanovector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cosine&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;remember&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;turn_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;assistant_reply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;assistant_reply&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;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;turn_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;meta&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;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&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;filepath&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;recall&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;query_embedding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&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;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage in your agent loop
&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentMemory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Recalls relevant past experiences in 0.15 milliseconds!
&lt;/span&gt;&lt;span class="n"&gt;memories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_task_embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Open Source &amp;amp; Community
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/eminsk/nanovector" rel="noopener noreferrer"&gt;https://github.com/eminsk/nanovector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/nanovector/" rel="noopener noreferrer"&gt;https://pypi.org/project/nanovector/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Google Colab Notebook:&lt;/strong&gt; &lt;a href="https://colab.research.google.com/github/eminsk/nanovector/blob/main/notebooks/nanovector_quickstart.ipynb" rel="noopener noreferrer"&gt;Open in Colab&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're tired of 200MB Docker images and 2-second cold imports for simple vector operations, give NanoVector a spin. ⭐ Star the project on GitHub if you believe in lightweight, bare-metal software!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>How I Beat NumPy Matrix Multiplication by 2.8x with a 100KB C Microkernel</title>
      <dc:creator>M_N_Nik | Python &amp; Systems</dc:creator>
      <pubDate>Mon, 07 Sep 2026 15:49:00 +0000</pubDate>
      <link>https://dev.to/eminsk/how-i-beat-numpy-matrix-multiplication-by-28x-with-a-100kb-c-microkernel-82k</link>
      <guid>https://dev.to/eminsk/how-i-beat-numpy-matrix-multiplication-by-28x-with-a-100kb-c-microkernel-82k</guid>
      <description>&lt;h1&gt;
  
  
  How I Beat NumPy Matrix Multiplication by 2.8x with a 100KB C Microkernel
&lt;/h1&gt;

&lt;p&gt;If you ask any Python engineer how to multiply two matrices as fast as possible on a CPU, the universal answer is: &lt;strong&gt;"Use NumPy."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And for good reason. NumPy doesn't actually compute the matrix product in Python. It delegates to heavily tuned, multi-threaded Fortran/C BLAS libraries like &lt;strong&gt;OpenBLAS&lt;/strong&gt; or &lt;strong&gt;Intel MKL&lt;/strong&gt;. These libraries represent decades of optimization by world-class systems engineers.&lt;/p&gt;

&lt;p&gt;So how could a single-file C extension of less than ~100KB beat NumPy by up to &lt;strong&gt;2.8x&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;The secret lies not in doing math faster, but in eliminating a silent killer: &lt;strong&gt;BLAS dispatch latency on small-to-medium matrices.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Cost: BLAS Dispatch Overhead
&lt;/h2&gt;

&lt;p&gt;BLAS libraries like OpenBLAS and Intel MKL were engineered for high-performance computing (HPC) and large batch operations — think 1024x1024 or 4096x4096 matrices.&lt;/p&gt;

&lt;p&gt;When you multiply large matrices, the time spent computing dwarfs any constant startup cost. But the architecture of modern AI inference has shifted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token-by-token autoregressive LLM decoding&lt;/strong&gt; (batch size B=1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edge computing &amp;amp; mobile neural nets&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robotics &amp;amp; Kalman filtering&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-time physics engines and sensor fusion&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these workloads, you frequently multiply small matrices (e.g., 16x16, 32x32, 64x64).&lt;/p&gt;

&lt;p&gt;NumPy and standard BLAS backends incur a &lt;strong&gt;fixed per-call overhead of ~3.0 to 5.0 microseconds&lt;/strong&gt;:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
┌──────────────────────────────────────────────────────────────┐
│  NumPy / BLAS Call Lifecycle                                 │
├───────────────┬─────────────────┬──────────────┬─────────────┤
│ Python GIL &amp;amp;  │ Thread pool     │ Memory check │ Compute     │
│ Argument Type │ Barrier Sync    │ &amp;amp; Alignment  │ Matrix Math │
│ Checking      │ (~2.5 µs)       │ (~0.5 µs)    │ (~0.5 µs)   │
│ (~0.8 µs)     │                 │              │             │
└───────────────┴─────────────────┴──────────────┴─────────────┘
  ▲                                                ▲
  └────────── Dispatch Overhead: ~3.8 µs ──────────┴─ Math: 0.5 µs


![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/k7mw18kx84zg5rq8u163.png)

Enter NanoGEMM
To solve this latency bottleneck, I developed NanoGEMM: a lightweight (~100KB), zero-dependency, register-tiled General Matrix Multiplication (GEMM) engine written in pure C with AVX2 + FMA intrinsics, exposed to Python via a zero-copy Buffer Protocol.

1. Register Tiling: Zero Stack Spilling
x86-64 processors with AVX2 feature 16 vector registers (ymm0 to ymm15), each 256 bits wide (holding 8 single-precision float32 values).

NanoGEMM implements a specialized 6x16 register-tiled microkernel:

12 YMM registers (ymm0 through ymm11) are permanently reserved as accumulators for the 6x16 output tile (6 rows × 2 vector registers of 8 floats = 12 registers).
2 YMM registers are used to load matrix B.
2 YMM registers are used for broadcasting elements of matrix A.

YMM Register Allocation (AVX2):
┌────────────────────────┬────────────────────────┐
│ ymm0:  C[0, 0..7]      │ ymm1:  C[0, 8..15]     │
│ ymm2:  C[1, 0..7]      │ ymm3:  C[1, 8..15]     │
│ ymm4:  C[2, 0..7]      │ ymm5:  C[2, 8..15]     │
│ ymm6:  C[3, 0..7]      │ ymm7:  C[3, 8..15]     │
│ ymm8:  C[4, 0..7]      │ ymm9:  C[4, 8..15]     │
│ ymm10: C[5, 0..7]      │ ymm11: C[5, 8..15]     │
├────────────────────────┴────────────────────────┤
│ ymm12..ymm13: Matrix B Vector Loads             │
│ ymm14..ymm15: Matrix A Broadcast Elements       │
└─────────────────────────────────────────────────┘
 Total: exactly 16 YMM registers. Zero register spills to RAM.

Because all accumulators reside permanently in the CPU register file throughout the inner loop, memory traffic is minimized to the theoretical limit.

2. Fused Multiply-Add (FMA) Outer Product
In the innermost kernel, we perform an outer-product accumulation using the hardware _mm256_fmadd_ps instruction (evaluating 
A × B + C A×B+C in a single CPU cycle):

for (int k = 0; k &amp;lt; K; k++) {
    __m256 b0 = _mm256_loadu_ps(&amp;amp;B[k * ldb + 0]);
    __m256 b1 = _mm256_loadu_ps(&amp;amp;B[k * ldb + 8]);

    #define FMA_ROW(row, y0, y1) { \
        __m256 a_elem = _mm256_set1_ps(A[row * lda + k]); \
        y0 = _mm256_fmadd_ps(a_elem, b0, y0); \
        y1 = _mm256_fmadd_ps(a_elem, b1, y1); \
    }

    FMA_ROW(0, c00, c01);
    FMA_ROW(1, c10, c11);
    FMA_ROW(2, c20, c21);
    FMA_ROW(3, c30, c31);
    FMA_ROW(4, c40, c41);
    FMA_ROW(5, c50, c51);
}

3. Zero-Copy Python Buffer Protocol
Calling C from Python often introduces overhead if arrays are copied. NanoGEMM implements Python's native Buffer Protocol (PEP 3118):

Py_buffer view_a, view_b;
PyObject_GetBuffer(obj_a, &amp;amp;view_a, PyBUF_SIMPLE);
PyObject_GetBuffer(obj_b, &amp;amp;view_b, PyBUF_SIMPLE);

float* ptr_a = (float*)view_a.buf;
float* ptr_b = (float*)view_b.buf;

nanogemm_sgemm(M, N, K, ptr_a, ptr_b, ptr_c);

Any contiguous NumPy array or Python memoryview passes directly to the hardware kernel without allocations or format conversions.


Benchmark Results
Benchmarks were conducted on an x86-64 machine (Intel Core / AVX2 + FMA, single thread, single core) across 10,000 warm iterations:

Matrix Dimensions   C Microkernel   NanoGEMM (Python)   NumPy (OpenBLAS)    Speedup vs NumPy
16x16   0.65 µs    1.23 µs    3.21 µs    ~2.6x faster
32x32   2.18 µs    2.74 µs    5.75 µs    ~2.1x faster
64x64   16.39 µs   17.76 µs   18.70 µs   ~1.1x faster
128x128 134.1 µs   136.2 µs   138.5 µs   Competitive parity

Quickstart

pip install nanogemm

import numpy as np
import nanogemm

# Generate random FP32 matrices
A = np.random.randn(32, 32).astype(np.float32)
B = np.random.randn(32, 32).astype(np.float32)

# Compute product via NanoGEMM
C = nanogemm.matmul(A, B)

# Verify mathematical correctness with NumPy
assert np.allclose(C, A @ B, atol=1e-5)
print("Math matches NumPy with 100% precision!")

Interactive Google Colab Demo
Run the interactive benchmarks directly in your browser:

👉 Open Interactive NanoGEMM Demo in Google Colab

Open Source Links
GitHub Repository: https://github.com/eminsk/nanogemm (MIT License)
PyPI Package: https://pypi.org/project/nanogemm/
Feel free to test on different CPUs, drop a star ⭐ on GitHub, and share your feedback!


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>performance</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
