<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Julius Metodiev</title>
    <subtitle>Software Architect — Rust, Go, distributed systems.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://369.is/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://369.is"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-05-09T00:00:00+00:00</updated>
    <id>https://369.is/atom.xml</id>
    <entry xml:lang="en">
        <title>Post-Cortex: Persistent Memory for AI Assistants</title>
        <published>2026-05-09T00:00:00+00:00</published>
        <updated>2026-05-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/blog/post-cortex-persistent-memory-for-ai/"/>
        <id>https://369.is/blog/post-cortex-persistent-memory-for-ai/</id>
        
        <content type="html" xml:base="https://369.is/blog/post-cortex-persistent-memory-for-ai/">&lt;p&gt;The thing that frustrates me most about working with AI assistants is the amnesia. Every new session starts from zero. Decisions made yesterday are gone. Problems debugged last week are debugged again. Context I painstakingly built up over a long conversation evaporates the moment I close the terminal.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;julymetodiev&#x2F;post-cortex&quot;&gt;Post-Cortex&lt;&#x2F;a&gt; is my answer to that. It is an MCP server that gives AI assistants long-term memory — a local, searchable knowledge base of conversations, decisions, and insights, with automatic entity extraction and a knowledge graph built on top.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-it-is&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#what-it-is&quot;&gt;What it is&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Post-Cortex sits between your AI client (Claude, Cursor, anything that speaks MCP) and a local store. Every meaningful exchange — a Q&amp;amp;A, a decision, a bug fix, a code change — gets logged into a session. Sessions live in workspaces. Across all of them, semantic search and entity-graph queries let the assistant find what it already knows before it asks you again.&lt;&#x2F;p&gt;
&lt;p&gt;The design constraints are deliberate:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local-first.&lt;&#x2F;strong&gt; All processing runs on your machine. No external APIs, no telemetry, no opaque cloud index of your work.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fast.&lt;&#x2F;strong&gt; Lock-free Rust architecture, HNSW vector search at O(log n), sub-10ms queries.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Flexible storage.&lt;&#x2F;strong&gt; Embedded RocksDB by default for zero-config use, SurrealDB when you want distribution.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Graph-RAG.&lt;&#x2F;strong&gt; Search results come back enriched with entity relationships, not just bag-of-text matches.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;install&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#install&quot;&gt;Install&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# Homebrew (macOS &amp;#x2F; Linux)
brew install julymetodiev&amp;#x2F;tap&amp;#x2F;post-cortex

# Or grab the binary directly
curl -L https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;julymetodiev&amp;#x2F;post-cortex&amp;#x2F;releases&amp;#x2F;latest&amp;#x2F;download&amp;#x2F;pcx-aarch64-apple-darwin -o &amp;#x2F;usr&amp;#x2F;local&amp;#x2F;bin&amp;#x2F;pcx
chmod +x &amp;#x2F;usr&amp;#x2F;local&amp;#x2F;bin&amp;#x2F;pcx
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The binary is &lt;code&gt;pcx&lt;&#x2F;code&gt;. Verify with &lt;code&gt;pcx --version&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wiring&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#wiring&quot;&gt;Wiring&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Post-Cortex is registered once, globally, and then every project on your machine gets memory for free.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# HTTP transport (recommended — requires the daemon)
claude mcp add --scope user --transport http post-cortex http:&amp;#x2F;&amp;#x2F;127.0.0.1:3737&amp;#x2F;mcp

# Stdio transport (no daemon needed)
claude mcp add --scope user --transport stdio post-cortex -- pcx
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then per project:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;pcx setup
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;pcx setup&lt;&#x2F;code&gt; creates a session, a workspace, a &lt;code&gt;CLAUDE.md&lt;&#x2F;code&gt; with memory rules, hooks that enforce them, and installs the agent definitions that let Claude know it has memory tools available. After that:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;claude
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Claude will search past knowledge before answering, and log new discoveries as it makes them. The whole thing is invisible most of the time — until the moment your assistant says &quot;we already decided this last week, here is the rationale&quot; and you remember why you wanted it in the first place.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tools&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#tools&quot;&gt;Tools&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Six tools, deliberately small:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tool&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;session&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Create and list sessions&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;update_conversation_context&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Store knowledge — Q&amp;amp;A, decisions, problems, code changes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;semantic_search&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Find related content across sessions, workspaces, or globally&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;get_structured_summary&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Session overview — decisions, insights, entities&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;query_conversation_context&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Entity relationships + keyword search&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;manage_workspace&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Organize sessions into workspaces&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The split between &lt;code&gt;semantic_search&lt;&#x2F;code&gt; and &lt;code&gt;query_conversation_context&lt;&#x2F;code&gt; matters: semantic search is for &quot;what do I already know about X&quot;, graph queries are for &quot;how is X related to Y&quot;. Both are cheap; both run locally.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;daemon-mode&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#daemon-mode&quot;&gt;Daemon mode&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;If you run multiple Claude instances — different terminals, different projects, an editor integration on the side — they should all share the same memory. The daemon is what makes that possible.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;pcx start    # start daemon
pcx status   # check status
pcx stop     # stop daemon
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With the daemon up, the HTTP transport is the right choice:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;{
  &amp;quot;mcpServers&amp;quot;: {
    &amp;quot;post-cortex&amp;quot;: {
      &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,
      &amp;quot;url&amp;quot;: &amp;quot;http:&amp;#x2F;&amp;#x2F;localhost:3737&amp;#x2F;mcp&amp;quot;
    }
  }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;One process owns the store, every client talks to it over JSON-RPC, and there is no lock contention or split-brain to worry about.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;storage&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#storage&quot;&gt;Storage&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;RocksDB (default)&lt;&#x2F;th&gt;&lt;th&gt;SurrealDB&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Setup&lt;&#x2F;td&gt;&lt;td&gt;Zero config&lt;&#x2F;td&gt;&lt;td&gt;Requires server&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Distribution&lt;&#x2F;td&gt;&lt;td&gt;Embedded&lt;&#x2F;td&gt;&lt;td&gt;Distributed&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Vector search&lt;&#x2F;td&gt;&lt;td&gt;HNSW O(log n)&lt;&#x2F;td&gt;&lt;td&gt;HNSW O(log n)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Both back the same MCP API; the choice is about deployment, not features. RocksDB is what you want on a laptop. SurrealDB is what you want when several machines should share the graph.&lt;&#x2F;p&gt;
&lt;p&gt;Configure in &lt;code&gt;~&#x2F;.post-cortex&#x2F;daemon.toml&lt;&#x2F;code&gt; or override with environment variables:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Variable&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;PC_HOST&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;127.0.0.1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bind address&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;PC_PORT&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;3737&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Port&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;PC_DATA_DIR&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;~&#x2F;.post-cortex&#x2F;data&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Storage location&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;PC_STORAGE_BACKEND&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;rocksdb&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;rocksdb&lt;&#x2F;code&gt; or &lt;code&gt;surrealdb&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;backups&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#backups&quot;&gt;Backups&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Memory you cannot back up is not memory you can rely on. Post-Cortex ships export&#x2F;import as first-class commands:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;pcx export --output backup.json       # full export
pcx export --output backup.json.gz    # compressed
pcx import --input backup.json        # restore
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The export is a plain JSON document. You can diff it, version it, copy it to another machine, or feed it into your own tooling.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-local&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#why-local&quot;&gt;Why local&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The reason this had to be local, not a hosted service, comes down to two things:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Trust.&lt;&#x2F;strong&gt; The whole point of memory is that it accumulates over months and years. The notes, the decisions, the half-formed ideas — that is exactly the material I am not willing to hand to a third party indefinitely.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Latency.&lt;&#x2F;strong&gt; Sub-10ms queries change how an assistant uses memory. If every recall is a network round-trip, the model treats memory as expensive and avoids it. If it is a local function call, the model uses it constantly. The behaviour shifts.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Static, on-disk, on-CPU is what makes both of those possible. HNSW gives logarithmic vector search; RocksDB gives durable storage without a server; the lock-free hot path keeps the daemon responsive under concurrent reads.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;post-cortex-persistent-memory-for-ai&#x2F;#future&quot;&gt;Future&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Post-Cortex is the storage layer in a larger pattern I keep coming back to: &lt;strong&gt;assistants should remember, search, and reason locally&lt;&#x2F;strong&gt;. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;julymetodiev&#x2F;Veles&quot;&gt;Veles&lt;&#x2F;a&gt; does the search side over code. Post-Cortex does the memory side over conversations and decisions. Together they cover most of what an agent needs to act usefully on a long-lived project without sending anything off the machine.&lt;&#x2F;p&gt;
&lt;p&gt;If you try it and something feels off, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;julymetodiev&#x2F;post-cortex&#x2F;issues&quot;&gt;open an issue&lt;&#x2F;a&gt; — I read all of them.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Using Veles: Fast Hybrid Local Code Search for AI Agents and Humans</title>
        <published>2026-05-09T00:00:00+00:00</published>
        <updated>2026-05-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/blog/veles-fast-local-code-search/"/>
        <id>https://369.is/blog/veles-fast-local-code-search/</id>
        
        <content type="html" xml:base="https://369.is/blog/veles-fast-local-code-search/">&lt;p&gt;I built &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;julymetodiev&#x2F;Veles&quot;&gt;Veles&lt;&#x2F;a&gt; because I kept hitting the same wall on every large codebase: &lt;code&gt;grep&lt;&#x2F;code&gt; is fast but literal, semantic search needs a GPU and an API key, and most &quot;AI code search&quot; tools assume you are willing to ship your source somewhere. None of that fits how I actually work locally, on CPU, with the index living next to the code.&lt;&#x2F;p&gt;
&lt;p&gt;Veles is a hybrid (BM25 + semantic) local code search engine, written in pure Rust. It runs entirely on CPU, persists its index on disk, exposes itself over CLI, MCP and gRPC, and returns results in tens of milliseconds.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-it-is&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#what-it-is&quot;&gt;What it is&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Veles is a small toolbox built around one idea: &lt;strong&gt;good code search is hybrid&lt;&#x2F;strong&gt;. Pure lexical search misses paraphrases. Pure semantic search misses identifiers. Reciprocal Rank Fusion blends the two and consistently outperforms either alone for code.&lt;&#x2F;p&gt;
&lt;p&gt;On top of that core it adds the things you actually want from a daily-driver:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A persistent on-disk index under &lt;code&gt;&amp;lt;repo&amp;gt;&#x2F;.veles&#x2F;&lt;&#x2F;code&gt;, with incremental updates.&lt;&#x2F;li&gt;
&lt;li&gt;Tree-sitter &lt;code&gt;symbols&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;defs&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;refs&lt;&#x2F;code&gt; for Rust, Python, JavaScript, TypeScript, and Go.&lt;&#x2F;li&gt;
&lt;li&gt;An identifier-aware tokenizer that splits &lt;code&gt;camelCase&lt;&#x2F;code&gt;, &lt;code&gt;snake_case&lt;&#x2F;code&gt;, and mixed scripts.&lt;&#x2F;li&gt;
&lt;li&gt;Query-type detection that biases symbol-like queries toward BM25 and natural-language queries toward semantic.&lt;&#x2F;li&gt;
&lt;li&gt;Six pipe-friendly output formats (&lt;code&gt;pretty&lt;&#x2F;code&gt;, &lt;code&gt;compact&lt;&#x2F;code&gt;, &lt;code&gt;ripgrep&lt;&#x2F;code&gt;, &lt;code&gt;paths&lt;&#x2F;code&gt;, &lt;code&gt;json&lt;&#x2F;code&gt;, &lt;code&gt;jsonl&lt;&#x2F;code&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;An MCP server so Claude, Cursor, and other agents can use it as a first-class search tool.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Static embeddings come from the &lt;a href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;minishlab&quot;&gt;potion&lt;&#x2F;a&gt; family via &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MinishLab&#x2F;model2vec-rs&quot;&gt;model2vec-rs&lt;&#x2F;a&gt;. No transformer forward pass at query time — that is what makes the latency predictable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;install&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#install&quot;&gt;Install&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Pick whichever path fits your environment:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;# macOS &amp;#x2F; Linux — prebuilt binary
curl --proto &amp;#x27;=https&amp;#x27; --tlsv1.2 -LsSf \
  https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;julymetodiev&amp;#x2F;Veles&amp;#x2F;releases&amp;#x2F;latest&amp;#x2F;download&amp;#x2F;veles-cli-installer.sh | sh

# Homebrew
brew install julymetodiev&amp;#x2F;tap&amp;#x2F;veles-cli

# From crates.io
cargo install veles-cli

# Windows (PowerShell)
irm https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;julymetodiev&amp;#x2F;Veles&amp;#x2F;releases&amp;#x2F;latest&amp;#x2F;download&amp;#x2F;veles-cli-installer.ps1 | iex
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Verify the install:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles --version
veles 0.2.2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;the-three-commands&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#the-three-commands&quot;&gt;The three commands&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Build the index, search it, refresh it. Here is what each one looks like against the Veles repo itself (32 source files):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles index .
Indexed 32 files &amp;#x2F; 190 chunks in 0.17s — saved to .&amp;#x2F;.veles
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles search &amp;quot;parse config file&amp;quot; -f compact
crates&amp;#x2F;veles-cli&amp;#x2F;src&amp;#x2F;handlers.rs:46-95  [score=0.015]  let path_slice: Option&amp;lt;&amp;amp;[String]&amp;gt; = glob_paths.as_deref();
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;walker.rs:46-95  [score=0.010]  &amp;quot;.ts&amp;quot;,
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;ranking&amp;#x2F;penalties.rs:91-140  [score=0.010]  let pool = top_k_indexed(&amp;amp;penalised, pool_size);
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:136-185  [score=0.009]  dir.join(MANIFEST_FILE).is_file()
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;symbols.rs:136-185  [score=0.009]  let name = match name_node.utf8_text(source_bytes) {
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles update .
Index is up to date (190 chunks, no changes).
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The first &lt;code&gt;search&lt;&#x2F;code&gt; downloads the embedding model (~64 MB) into &lt;code&gt;~&#x2F;.cache&#x2F;huggingface&#x2F;hub&#x2F;&lt;&#x2F;code&gt;. After that everything is local. &lt;code&gt;update&lt;&#x2F;code&gt; reuses embeddings of files whose &lt;code&gt;(size, mtime)&lt;&#x2F;code&gt; fingerprint has not changed, so refreshing after a small edit is near-instant even on large repos.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;veles status&lt;&#x2F;code&gt; is the diagnostic — model, dimension, chunk counts, and an on-disk diff against the manifest:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles status
Index at .&amp;#x2F;.veles
  veles version    : 0.2.2
  format version   : 2
  model            : minishlab&amp;#x2F;potion-code-16M
  embedding dim    : 256
  text files       : false
  indexed at       : 1778349001 (unix)
  files in manifest: 32
  total chunks     : 190

On-disk diff:
  files seen now   : 32
  added            : 0
  modified         : 0
  removed          : 0
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;searching&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#searching&quot;&gt;Searching&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The default mode is hybrid, but you can pin the mode when you know what you want. The clearest way to see the difference is to run a symbol query through BM25 and a concept query through semantic, side by side:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles search &amp;quot;BM25 inverted index&amp;quot; -m bm25 -f compact -t 3
crates&amp;#x2F;veles-core&amp;#x2F;examples&amp;#x2F;bm25_compare.rs:181-230  [score=12.978]  let queries: Vec&amp;lt;Vec&amp;lt;String&amp;gt;&amp;gt; = [
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;index&amp;#x2F;sparse.rs:1-50          [score=12.139]  &amp;#x2F;&amp;#x2F;! BM25 sparse index — inverted-index implementation with token interning.
crates&amp;#x2F;veles-core&amp;#x2F;examples&amp;#x2F;bench.rs:1-50            [score=11.649]  &amp;#x2F;&amp;#x2F;! Quick wall-clock benchmark for indexing + querying.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles search &amp;quot;how the index gets persisted to disk&amp;quot; -m semantic -f compact -t 3
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:1-50    [score=0.887]  &amp;#x2F;&amp;#x2F;! Persistent on-disk index format.
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:46-95   [score=0.886]  &amp;#x2F;&amp;#x2F;&amp;#x2F; content hashing can be layered on later if needed.
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;lib.rs:46-95       [score=0.887]  &amp;#x2F;&amp;#x2F;! # }
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;BM25 lands on the literal &lt;code&gt;BM25 sparse index&lt;&#x2F;code&gt; doc-comment first; semantic lands on &lt;code&gt;persist.rs&lt;&#x2F;code&gt; even though the query never says &quot;persist&quot;. That gap is what hybrid is closing — the default mode runs both and fuses the rankings via RRF.&lt;&#x2F;p&gt;
&lt;p&gt;Filters compose cleanly with globs and language hints:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;veles search &amp;quot;auth&amp;quot;  -l rust,python                          # language filter
veles search &amp;quot;X&amp;quot;     -g &amp;#x27;src&amp;#x2F;**&amp;#x2F;*.rs&amp;#x27; -x &amp;#x27;src&amp;#x2F;legacy&amp;#x2F;**&amp;#x27;     # include &amp;#x2F; exclude
veles search &amp;quot;BM25&amp;quot;  --min-score 0.4                         # drop weak hits
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The output formats are designed to flow into Unix pipelines. &lt;code&gt;rg&lt;&#x2F;code&gt; mode is drop-in compatible with anything that already consumes ripgrep:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles search &amp;quot;rate limiting&amp;quot; -f rg | head -5
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;ranking&amp;#x2F;boosting.rs:451:            &amp;quot;PREVIEW_FILE_CACHE&amp;quot;,
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;ranking&amp;#x2F;boosting.rs:452:            &amp;quot;_private_thing&amp;quot;,
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;ranking&amp;#x2F;boosting.rs:453:            &amp;quot;foo::bar&amp;quot;,
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;ranking&amp;#x2F;boosting.rs:454:            &amp;quot;module::Type&amp;quot;,
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;ranking&amp;#x2F;boosting.rs:455:            &amp;quot;obj-&amp;gt;method&amp;quot;,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;paths&lt;&#x2F;code&gt; mode strips everything except file paths — exactly what &lt;code&gt;xargs&lt;&#x2F;code&gt; wants:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles search &amp;quot;rate limiting&amp;quot; -f paths
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;ranking&amp;#x2F;boosting.rs
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;walker.rs
crates&amp;#x2F;veles-cli&amp;#x2F;src&amp;#x2F;tui&amp;#x2F;app.rs
crates&amp;#x2F;veles-mcp&amp;#x2F;src&amp;#x2F;lib.rs
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;veles_index.rs
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;json&lt;&#x2F;code&gt; is structured for tooling and agents:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles search &amp;quot;rate limiting&amp;quot; -f json -t 1 | jq &amp;#x27;.results[0] | {file_path, start_line, end_line, score, language}&amp;#x27;
{
  &amp;quot;file_path&amp;quot;: &amp;quot;crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;walker.rs&amp;quot;,
  &amp;quot;start_line&amp;quot;: 136,
  &amp;quot;end_line&amp;quot;: 185,
  &amp;quot;score&amp;quot;: 0.00970386039132734,
  &amp;quot;language&amp;quot;: &amp;quot;rust&amp;quot;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That &lt;code&gt;paths&lt;&#x2F;code&gt; mode is the small trick that turns search into navigation:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;veles search &amp;quot;rate limiting&amp;quot; -f paths | xargs $EDITOR
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;symbols&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#symbols&quot;&gt;Symbols&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;grep -w SymbolName&lt;&#x2F;code&gt; is a poor approximation of &quot;find this definition&quot;. Veles uses tree-sitter to do it properly. &lt;code&gt;symbols&lt;&#x2F;code&gt; is the file outline:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles symbols crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs
Symbols in crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs

  const      INDEX_DIR_NAME                  crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:31
  const      FORMAT_VERSION                  crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:35
  const      MANIFEST_FILE                   crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:37
  struct     FileFingerprint                 crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:48
  struct     Manifest                        crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:80
  struct     PersistedIndex                  crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:144
  function   save                            crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:153
  function   load                            crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:173
  function   load_manifest                   crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:207
  function   clean                           crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:213
  ...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;defs&lt;&#x2F;code&gt; resolves a name across the whole repo, optionally narrowed by kind and language:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles defs Manifest
Definitions of &amp;quot;Manifest&amp;quot;

  struct     Manifest                        crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:80
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles defs save -k function -l rust
Definitions of &amp;quot;save&amp;quot;

  function   save                            crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:153
  function   save                            crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;veles_index.rs:139
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;refs&lt;&#x2F;code&gt; does both — it lists the definitions, then the BM25 hits across chunks so you see every callsite, doc-comment, and test that mentions the symbol:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;console&quot; class=&quot;language-console &quot;&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;$ veles refs save -t 5 -f compact
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;persist.rs:153	function	save
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;veles_index.rs:139	function	save
crates&amp;#x2F;veles-core&amp;#x2F;src&amp;#x2F;veles_index.rs:136-185  [score=3.662]  &amp;#x2F;&amp;#x2F;&amp;#x2F; Persist the index to `&amp;lt;repo_root&amp;gt;&amp;#x2F;.veles&amp;#x2F;`.
crates&amp;#x2F;veles-cli&amp;#x2F;src&amp;#x2F;cli.rs:1-50              [score=3.554]  &amp;#x2F;&amp;#x2F;! Command-line interface definition (clap derives).
crates&amp;#x2F;veles-core&amp;#x2F;examples&amp;#x2F;bm25_compare.rs:181-230  [score=2.838]  let queries: Vec&amp;lt;Vec&amp;lt;String&amp;gt;&amp;gt; = [
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is the workflow I use the most when navigating an unfamiliar codebase: &lt;code&gt;defs&lt;&#x2F;code&gt; to land on the canonical definition, then &lt;code&gt;refs&lt;&#x2F;code&gt; to fan out.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-tui&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#the-tui&quot;&gt;The TUI&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;veles tui
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;veles-tui-demo.gif&quot; alt=&quot;Veles TUI — live hybrid search with preview pane&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Loads the persistent index once, then debounces queries so each keystroke re-runs in tens of milliseconds. &lt;code&gt;↑↓&lt;&#x2F;code&gt; navigate, &lt;code&gt;Tab&lt;&#x2F;code&gt; cycles &lt;code&gt;hybrid&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;bm25&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;semantic&lt;&#x2F;code&gt;, &lt;code&gt;Ctrl-R&lt;&#x2F;code&gt; finds related code, &lt;code&gt;Enter&lt;&#x2F;code&gt; prints &lt;code&gt;path:line&lt;&#x2F;code&gt; to stdout, &lt;code&gt;Ctrl-O&lt;&#x2F;code&gt; opens the result in &lt;code&gt;$EDITOR&lt;&#x2F;code&gt;. &lt;code&gt;?&lt;&#x2F;code&gt; shows the full keybinding overlay.&lt;&#x2F;p&gt;
&lt;p&gt;The handy bit: because &lt;code&gt;Enter&lt;&#x2F;code&gt; prints &lt;code&gt;path:line&lt;&#x2F;code&gt;, you can use the TUI as a picker:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;$EDITOR $(veles tui)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;mcp&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#mcp&quot;&gt;MCP&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is what pushed me to build it in the first place. AI agents are good at writing code, but only if they can find the right code to read. Vague greps and unbounded reads burn the context window fast.&lt;&#x2F;p&gt;
&lt;p&gt;Veles ships an MCP server over stdio. Wire it into Claude Code or any other MCP-aware client and the agent gets two tools: &lt;code&gt;search&lt;&#x2F;code&gt; and &lt;code&gt;find_related&lt;&#x2F;code&gt;. From the client&#x27;s perspective:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;veles serve-mcp     # explicit
veles               # equivalent — bare `veles` starts MCP when stdin is piped
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The agent then asks targeted questions (&quot;where do we parse config?&quot;, &quot;what is similar to this function?&quot;) and gets back a small, ranked, file-bounded set of chunks instead of a recursive grep dump. In practice this is the difference between an agent that wanders and one that lands on the right file on the first try.&lt;&#x2F;p&gt;
&lt;p&gt;There is also a gRPC service (&lt;code&gt;veles serve-grpc&lt;&#x2F;code&gt;) for non-MCP integrations.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;embedding&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#embedding&quot;&gt;Embedding&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;If you want the engine without the binary, pull &lt;code&gt;veles-core&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;[dependencies]
veles-core = &amp;quot;0.2&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;use std::path::Path;
use veles_core::{SearchMode, VelesIndex};

let index = VelesIndex::from_path(Path::new(&amp;quot;.&amp;quot;), None, None, false)?;
let results = index.search(&amp;quot;parse config&amp;quot;, 5, SearchMode::Hybrid, None, None, None);
for r in results {
    println!(&amp;quot;{} [{:.3}]&amp;quot;, r.chunk.location(), r.score);
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The workspace also publishes &lt;code&gt;veles-grpc&lt;&#x2F;code&gt;, &lt;code&gt;veles-mcp&lt;&#x2F;code&gt;, and &lt;code&gt;veles-cli&lt;&#x2F;code&gt; separately, so you can compose only the layers you need.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;index-layout&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#index-layout&quot;&gt;Index layout&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;.veles&amp;#x2F;
  manifest.json   # model, dim, per-file (size, mtime, chunk_count)
  chunks.bin      # bincode Vec&amp;lt;Chunk&amp;gt;
  bm25.bin        # bincode BM25 inverted index
  dense.bin       # bincode dense matrix
  symbols.bin     # bincode tree-sitter symbols
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Everything is bincode-serialized and lives next to the code. Nothing leaves the machine, nothing depends on a network round-trip at query time, and the on-disk format is small enough to commit-and-forget if you want builds to skip the index step.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cpu-only&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#cpu-only&quot;&gt;CPU-only&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;A lot of the design decisions in Veles fall out of one constraint: &lt;strong&gt;no GPU, no API call, no transformer forward pass at query time&lt;&#x2F;strong&gt;. That is what makes static embeddings (model2vec &#x2F; potion) the right choice — they are precomputed once at indexing time, and queries become a vector lookup plus a BM25 scan plus a fusion step. The result is latency that does not depend on model load, network, or GPU availability.&lt;&#x2F;p&gt;
&lt;p&gt;It also means Veles works the same way on your laptop, in CI, in a dev container, and over SSH on a constrained box. That portability is the thing I value most when I am switching between machines all day.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;369.is&#x2F;blog&#x2F;veles-fast-local-code-search&#x2F;#future&quot;&gt;Future&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Veles started as a Rust port of the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MinishLab&#x2F;semble&quot;&gt;Semble&lt;&#x2F;a&gt; hybrid retrieval recipe and grew into something I use every day. The roadmap is mostly driven by what I keep wanting at the keyboard: more languages in the symbol layer, smarter query-type detection, and tighter integration with the agents I run locally.&lt;&#x2F;p&gt;
&lt;p&gt;If you try it and something feels off, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;julymetodiev&#x2F;Veles&#x2F;issues&quot;&gt;open an issue&lt;&#x2F;a&gt; — I read all of them.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;veles search &amp;quot;what should I read first&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Veles</title>
        <published>2026-05-01T00:00:00+00:00</published>
        <updated>2026-05-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/projects/veles/"/>
        <id>https://369.is/projects/veles/</id>
        
        <content type="html" xml:base="https://369.is/projects/veles/">&lt;p&gt;Fast hybrid (BM25 + semantic) local code search for AI agents and humans, written in pure Rust.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;veles-tui-demo.gif&quot; alt=&quot;Veles interactive TUI in action&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;capabilities&quot;&gt;Capabilities&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tech:&lt;&#x2F;strong&gt; Rust, tree-sitter, model2vec, BM25, MCP, gRPC (tonic), Tokio&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;&#x2F;strong&gt; Millisecond-latency code search over a persistent on-disk index — no GPU, no API calls&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Features:&lt;&#x2F;strong&gt; Hybrid retrieval with Reciprocal Rank Fusion, identifier-aware tokenizer, query-type detection, definition boosting, file saturation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Symbols:&lt;&#x2F;strong&gt; Tree-sitter &lt;code&gt;symbols&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;defs&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;refs&lt;&#x2F;code&gt; for Rust, Python, JavaScript, TypeScript, Go&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Interfaces:&lt;&#x2F;strong&gt; CLI, interactive TUI, MCP stdio server, gRPC service, six pipe-friendly output formats&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Distribution:&lt;&#x2F;strong&gt; Published crates (&lt;code&gt;veles-cli&lt;&#x2F;code&gt;, &lt;code&gt;veles-core&lt;&#x2F;code&gt;), prebuilt binaries for macOS &#x2F; Linux &#x2F; Windows, Homebrew tap&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Focus:&lt;&#x2F;strong&gt; CPU-only static embeddings, persistent + incremental indexing, AI-agent integration (Claude, Cursor)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Post-Cortex</title>
        <published>2025-11-17T00:00:00+00:00</published>
        <updated>2025-11-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/projects/post-cortex/"/>
        <id>https://369.is/projects/post-cortex/</id>
        
        <content type="html" xml:base="https://369.is/projects/post-cortex/">&lt;p&gt;Post-Cortex is an MCP server that gives AI assistants long-term memory. It stores conversations, decisions, and insights in a durable, searchable knowledge base — with automatic entity extraction and a graph built on top of every write.&lt;&#x2F;p&gt;
&lt;p&gt;The design constraints are deliberate:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local-first.&lt;&#x2F;strong&gt; All processing runs on your machine. No external APIs, no telemetry, no opaque cloud index of your work.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fast.&lt;&#x2F;strong&gt; Lock-free Rust architecture, HNSW vector search at O(log n), single-digit-ms write latency on warm paths, ms-per-text Model2Vec inference.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Flexible storage.&lt;&#x2F;strong&gt; Embedded RocksDB by default for zero-config use, SurrealDB when you want distribution.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Graph-RAG.&lt;&#x2F;strong&gt; Search results come back enriched with entity relationships, not just bag-of-text matches.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;workspace-layout&quot;&gt;Workspace layout&lt;&#x2F;h3&gt;
&lt;p&gt;Post-Cortex is a Cargo workspace of &lt;strong&gt;eight publishable crates&lt;&#x2F;strong&gt;. Downstream Rust projects can pick whichever layer they actually need — &lt;code&gt;post-cortex-core&lt;&#x2F;code&gt; carries no transport, I&#x2F;O or ML dependencies, so it can be consumed for the type system alone without dragging in RocksDB, Candle, or the server stack.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Crate&lt;&#x2F;th&gt;&lt;th&gt;Pick when you need…&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex&quot;&gt;&lt;code&gt;post-cortex&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;The full stack in one dep&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex-core&quot;&gt;&lt;code&gt;post-cortex-core&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Domain types + traits only (no I&#x2F;O, no ML)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex-proto&quot;&gt;&lt;code&gt;post-cortex-proto&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;gRPC wire types (client-side)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex-embeddings&quot;&gt;&lt;code&gt;post-cortex-embeddings&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Model2Vec (default) + BERT embedders + HNSW vector DB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex-storage&quot;&gt;&lt;code&gt;post-cortex-storage&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;RocksDB + SurrealDB backends&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex-memory&quot;&gt;&lt;code&gt;post-cortex-memory&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ConversationMemorySystem&lt;&#x2F;code&gt; orchestrator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex-mcp&quot;&gt;&lt;code&gt;post-cortex-mcp&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;MCP tool functions (embed in any MCP host)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;post-cortex-daemon&quot;&gt;&lt;code&gt;post-cortex-daemon&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;pcx&lt;&#x2F;code&gt; CLI + rmcp&#x2F;axum&#x2F;tonic server&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;mcp-surface&quot;&gt;MCP surface&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;code&gt;pcx&lt;&#x2F;code&gt; daemon exposes a small but expressive MCP toolset — &lt;code&gt;session&lt;&#x2F;code&gt;, &lt;code&gt;update_conversation_context&lt;&#x2F;code&gt; (with required typed &lt;code&gt;entities&lt;&#x2F;code&gt; + &lt;code&gt;relations&lt;&#x2F;code&gt; arrays as of 0.3.0), &lt;code&gt;bulk_update_conversation_context&lt;&#x2F;code&gt;, &lt;code&gt;semantic_search&lt;&#x2F;code&gt;, &lt;code&gt;get_structured_summary&lt;&#x2F;code&gt;, &lt;code&gt;query_conversation_context&lt;&#x2F;code&gt;, &lt;code&gt;assemble_context&lt;&#x2F;code&gt; (graph-aware retrieval), &lt;code&gt;manage_workspace&lt;&#x2F;code&gt;, &lt;code&gt;manage_entity&lt;&#x2F;code&gt;, and &lt;code&gt;admin&lt;&#x2F;code&gt; (health, vectorize-session, vectorize-stats, checkpoints). Same canonical write path under all of them.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;release-line&quot;&gt;Release line&lt;&#x2F;h3&gt;
&lt;p&gt;The current release is &lt;strong&gt;0.3.0&lt;&#x2F;strong&gt; — Model2Vec embedder by default, non-blocking write pipeline, and the canonical single-entrypoint write contract. CI enforces &lt;code&gt;cargo fmt&lt;&#x2F;code&gt;, &lt;code&gt;clippy -D warnings&lt;&#x2F;code&gt;, &lt;code&gt;cargo deny check&lt;&#x2F;code&gt;, and &lt;code&gt;cargo audit&lt;&#x2F;code&gt; on every push to &lt;code&gt;main&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>rust-mexc-ws</title>
        <published>2025-06-01T00:00:00+00:00</published>
        <updated>2025-06-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/projects/rust-mexc-ws/"/>
        <id>https://369.is/projects/rust-mexc-ws/</id>
        
        <content type="html" xml:base="https://369.is/projects/rust-mexc-ws/">&lt;p&gt;&lt;strong&gt;Role:&lt;&#x2F;strong&gt; Creator &#x2F; Lead Developer
&lt;strong&gt;Timeline:&lt;&#x2F;strong&gt; 2025 — Present
&lt;strong&gt;Status:&lt;&#x2F;strong&gt; Open Source &#x2F; Production Ready&lt;&#x2F;p&gt;
&lt;h3 id=&quot;key-features&quot;&gt;Key Features&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Production-grade WebSocket client for MEXC exchange&lt;&#x2F;li&gt;
&lt;li&gt;Protocol Buffers support for minimal latency&lt;&#x2F;li&gt;
&lt;li&gt;HFT-ready architecture with sub-millisecond performance&lt;&#x2F;li&gt;
&lt;li&gt;Zero-panic design with comprehensive safety mechanisms&lt;&#x2F;li&gt;
&lt;li&gt;Multithreaded architecture supporting 1,300+ msgs&#x2F;sec sustained throughput&lt;&#x2F;li&gt;
&lt;li&gt;Memory-bounded operations with automatic cleanup&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;technical-stack&quot;&gt;Technical Stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Language:&lt;&#x2F;strong&gt; Rust (100% safe code, zero unsafe blocks)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Protocols:&lt;&#x2F;strong&gt; WebSocket, Protocol Buffers, gRPC&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Architecture:&lt;&#x2F;strong&gt; Lock-free design, ring buffers, object pools&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Concurrency:&lt;&#x2F;strong&gt; Tokio async runtime, atomic operations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Testing:&lt;&#x2F;strong&gt; Comprehensive test suite with 100% Clippy compliance&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;technical-achievements&quot;&gt;Technical Achievements&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lock-free hot path:&lt;&#x2F;strong&gt; ring buffers and object pools for microsecond latency&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zero-allocation operations:&lt;&#x2F;strong&gt; pre-allocated objects eliminate heap allocations in critical paths&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Intelligent backpressure:&lt;&#x2F;strong&gt; emergency mode with probabilistic throttling&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Memory safety:&lt;&#x2F;strong&gt; hard limits with emergency cleanup (512MB default)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Multithreaded scaling:&lt;&#x2F;strong&gt; 10 symbols × 3 channels = 30 concurrent streams&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Financial precision:&lt;&#x2F;strong&gt; complete Decimal usage eliminates floating-point errors&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;impact-recognition&quot;&gt;Impact &amp;amp; Recognition&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Production-ready library for algorithmic trading systems&lt;&#x2F;li&gt;
&lt;li&gt;Comprehensive documentation with multiple demo applications&lt;&#x2F;li&gt;
&lt;li&gt;Zero-crash design through elimination of all panic points&lt;&#x2F;li&gt;
&lt;li&gt;HFT-grade performance optimisations for enterprise use&lt;&#x2F;li&gt;
&lt;li&gt;Open source contribution to Rust cryptocurrency ecosystem&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>About Me</title>
        <published>2025-01-15T00:00:00+00:00</published>
        <updated>2025-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/about/"/>
        <id>https://369.is/about/</id>
        
        <content type="html" xml:base="https://369.is/about/">&lt;h1 id=&quot;julius-metodiev&quot;&gt;Julius Metodiev&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;software-architect&quot;&gt;Software Architect&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;m a passionate software architect with extensive experience in designing and building scalable systems. I specialize in creating robust, maintainable solutions that solve real-world problems.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;professional-summary&quot;&gt;Professional Summary&lt;&#x2F;h2&gt;
&lt;p&gt;With years of experience in software development and system architecture, I focus on:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System Design &amp;amp; Architecture&lt;&#x2F;strong&gt; - Designing scalable, maintainable software systems&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Technical Leadership&lt;&#x2F;strong&gt; - Leading development teams and making strategic technical decisions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Problem Solving&lt;&#x2F;strong&gt; - Analyzing complex requirements and delivering effective solutions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Learning&lt;&#x2F;strong&gt; - Staying current with emerging technologies and best practices&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;technical-expertise&quot;&gt;Technical Expertise&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;core-technologies&quot;&gt;Core Technologies&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Languages:&lt;&#x2F;strong&gt; Go, Rust, Python, JavaScript, TypeScript, Java&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Frontend:&lt;&#x2F;strong&gt; React, Vue.js, HTML5, CSS3, Tailwind CSS&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Backend:&lt;&#x2F;strong&gt; Go microservices, Rust libraries, gRPC APIs, Node.js, Django&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Databases:&lt;&#x2F;strong&gt; PostgreSQL with PostGIS, Qdrant vector database, MongoDB, Redis&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;architecture-devops&quot;&gt;Architecture &amp;amp; DevOps&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Architecture Patterns:&lt;&#x2F;strong&gt; Microservices (15+ services), Domain-Driven Design, Event-Driven Architecture&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Messaging:&lt;&#x2F;strong&gt; NATS for high-performance inter-service communication, WebSocket protocols&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Platforms:&lt;&#x2F;strong&gt; AWS, Azure, Google Cloud Platform&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Containerization:&lt;&#x2F;strong&gt; Docker, Kubernetes with HA infrastructure&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CI&#x2F;CD:&lt;&#x2F;strong&gt; GitHub Actions, GitLab CI, Jenkins&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;ai-specialized-technologies&quot;&gt;AI &amp;amp; Specialized Technologies&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI&#x2F;ML:&lt;&#x2F;strong&gt; Custom compatibility algorithms, MBTI&#x2F;Human Design systems&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Vector Databases:&lt;&#x2F;strong&gt; Qdrant with specialized embeddings&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Performance:&lt;&#x2F;strong&gt; Sub-100ms response times, 99.9% uptime systems&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;HFT Systems:&lt;&#x2F;strong&gt; Lock-free programming, microsecond latency optimization&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Financial Tech:&lt;&#x2F;strong&gt; Protocol Buffers, real-time data processing (1,300+ msgs&#x2F;sec)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Geospatial:&lt;&#x2F;strong&gt; PostGIS integration for location-based features&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;tools-methodologies&quot;&gt;Tools &amp;amp; Methodologies&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version Control:&lt;&#x2F;strong&gt; Git, GitHub, GitLab&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Project Management:&lt;&#x2F;strong&gt; Agile, Scrum, Kanban&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring:&lt;&#x2F;strong&gt; Prometheus, Grafana, ELK Stack, real-time alerting&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Testing:&lt;&#x2F;strong&gt; Unit Testing, Integration Testing, TDD, load testing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;what-i-do&quot;&gt;What I Do&lt;&#x2F;h2&gt;
&lt;p&gt;I help organizations build better software by:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Architecting Solutions&lt;&#x2F;strong&gt; - Designed microservices platform serving 10,000+ users with 99.9% uptime&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Performance Engineering&lt;&#x2F;strong&gt; - Achieved sub-100ms response times across distributed systems&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AI Implementation&lt;&#x2F;strong&gt; - Built compatibility algorithms improving match accuracy by 40%&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Team Leadership&lt;&#x2F;strong&gt; - Led development of 15+ microservices with modern tech stack&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Technical Strategy&lt;&#x2F;strong&gt; - Strategic technology decisions for scalable, maintainable systems&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;open-source-community&quot;&gt;Open Source &amp;amp; Community&lt;&#x2F;h2&gt;
&lt;p&gt;I actively contribute to the open source community:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rust-mexc-ws&lt;&#x2F;strong&gt;: Production-grade WebSocket client for MEXC exchange (Rust)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;rust-binance&lt;&#x2F;strong&gt;: High-performance async client for Binance WebSocket API (Rust)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cryptocurrency Libraries&lt;&#x2F;strong&gt;: Building HFT-ready libraries for algorithmic trading&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zero-unsafe Rust&lt;&#x2F;strong&gt;: Advocate for memory-safe systems programming&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Performance Engineering&lt;&#x2F;strong&gt;: Lock-free algorithms and microsecond optimization&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;interests&quot;&gt;Interests&lt;&#x2F;h2&gt;
&lt;p&gt;When I&#x27;m not coding, I enjoy:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Contributing to open-source projects&lt;&#x2F;li&gt;
&lt;li&gt;Learning about new technologies and frameworks&lt;&#x2F;li&gt;
&lt;li&gt;Reading about software engineering best practices&lt;&#x2F;li&gt;
&lt;li&gt;Exploring high-frequency trading and financial technology&lt;&#x2F;li&gt;
&lt;li&gt;Experimenting with systems programming in Rust&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Feel free to &lt;a href=&quot;&#x2F;contact&quot;&gt;get in touch&lt;&#x2F;a&gt; if you&#x27;d like to discuss technology, collaborate on projects, or just have a chat about software development.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Contact</title>
        <published>2025-01-15T00:00:00+00:00</published>
        <updated>2025-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/contact/"/>
        <id>https://369.is/contact/</id>
        
        <content type="html" xml:base="https://369.is/contact/">&lt;h1 id=&quot;get-in-touch&quot;&gt;Get In Touch&lt;&#x2F;h1&gt;
&lt;p&gt;I&#x27;m always interested in discussing new opportunities, collaborating on interesting projects, or just having a conversation about technology and software development.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;professional-networks&quot;&gt;Professional Networks&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;linkedin.com&#x2F;in&#x2F;julius-metodiev-927170116&quot;&gt;Connect with me on LinkedIn&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;GitLab:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;users&#x2F;Cryptle&#x2F;projects&quot;&gt;View my code and projects&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Twitter&#x2F;X:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;x.com&#x2F;JMetodiev&quot;&gt;@JMetodiev&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>go-collector</title>
        <published>2024-06-01T00:00:00+00:00</published>
        <updated>2024-06-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/projects/go-collector/"/>
        <id>https://369.is/projects/go-collector/</id>
        
        <content type="html" xml:base="https://369.is/projects/go-collector/">&lt;p&gt;High-performance Go service for collecting cryptocurrency order book data.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tech:&lt;&#x2F;strong&gt; Go, Kafka &#x2F; Redpanda, ClickHouse, Prometheus, WebSocket&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;&#x2F;strong&gt; Real-time order book data collection and analysis pipeline&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Features:&lt;&#x2F;strong&gt; Binance protocol compliance, automatic sequence validation, metrics monitoring&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Architecture:&lt;&#x2F;strong&gt; WebSocket → Kafka → ClickHouse with health checks and Grafana dashboards&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>rust-binance</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/projects/rust-binance/"/>
        <id>https://369.is/projects/rust-binance/</id>
        
        <content type="html" xml:base="https://369.is/projects/rust-binance/">&lt;p&gt;High-performance, asynchronous Rust client for Binance WebSocket API.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tech:&lt;&#x2F;strong&gt; Rust, Tokio, FlatBuffers, WebSocket protocols&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;&#x2F;strong&gt; Real-time cryptocurrency market data processing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Features:&lt;&#x2F;strong&gt; Zero-copy serialisation, intelligent reconnection, combined streams&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Focus:&lt;&#x2F;strong&gt; HFT-ready performance with type-safe API design&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Equal Dating</title>
        <published>2018-01-01T00:00:00+00:00</published>
        <updated>2018-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Julius Metodiev
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://369.is/projects/equal-dating/"/>
        <id>https://369.is/projects/equal-dating/</id>
        
        <content type="html" xml:base="https://369.is/projects/equal-dating/">&lt;p&gt;&lt;strong&gt;Role:&lt;&#x2F;strong&gt; Software Architect &#x2F; Lead Developer
&lt;strong&gt;Timeline:&lt;&#x2F;strong&gt; 2018 — Present (7 years of research and development)
&lt;strong&gt;Status:&lt;&#x2F;strong&gt; Production — Serving 10,000+ users&lt;&#x2F;p&gt;
&lt;h3 id=&quot;architecture-scale&quot;&gt;Architecture &amp;amp; Scale&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Microservices platform with 15+ services achieving 99.9% uptime&lt;&#x2F;li&gt;
&lt;li&gt;Sub-100ms response times across all endpoints&lt;&#x2F;li&gt;
&lt;li&gt;High-availability Kubernetes infrastructure&lt;&#x2F;li&gt;
&lt;li&gt;NATS messaging system for real-time communication&lt;&#x2F;li&gt;
&lt;li&gt;PostgreSQL database with 150+ tables and PostGIS integration&lt;&#x2F;li&gt;
&lt;li&gt;Automated backup strategies and disaster recovery&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;key-features&quot;&gt;Key Features&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;AI-powered compatibility systems using MBTI &#x2F; Human Design algorithms&lt;&#x2F;li&gt;
&lt;li&gt;Progressive photo reveal through conversation points system&lt;&#x2F;li&gt;
&lt;li&gt;Gamified dating experience with achievements and leveling&lt;&#x2F;li&gt;
&lt;li&gt;Vector database (Qdrant) with specialised embeddings for compatibility&lt;&#x2F;li&gt;
&lt;li&gt;No swiping — focus on meaningful conversations first&lt;&#x2F;li&gt;
&lt;li&gt;Message scoring system that rewards quality interactions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;technical-stack&quot;&gt;Technical Stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backend:&lt;&#x2F;strong&gt; Go microservices, Rust services, gRPC APIs&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Messaging:&lt;&#x2F;strong&gt; NATS for inter-service communication&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Database:&lt;&#x2F;strong&gt; PostgreSQL with PostGIS, Qdrant vector database&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure:&lt;&#x2F;strong&gt; Kubernetes, Docker, high-availability setup&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AI &#x2F; ML:&lt;&#x2F;strong&gt; Custom compatibility algorithms and embeddings&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring:&lt;&#x2F;strong&gt; Real-time performance tracking and alerting&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;key-achievements&quot;&gt;Key Achievements&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Improved match accuracy by 40% through AI-powered algorithms&lt;&#x2F;li&gt;
&lt;li&gt;Architected scalable platform serving 10,000+ concurrent users&lt;&#x2F;li&gt;
&lt;li&gt;Eliminated superficial swiping culture in dating apps&lt;&#x2F;li&gt;
&lt;li&gt;7-year research foundation for compatibility science&lt;&#x2F;li&gt;
&lt;li&gt;Built high-performance vector search for advanced compatibility assessment&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Company: &lt;strong&gt;Resistance Group&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
