<?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: zinverno</title>
    <description>The latest articles on DEV Community by zinverno (@zinverno).</description>
    <link>https://dev.to/zinverno</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%2F4068551%2Fa488664c-447e-4e87-917c-4581fd2a8aa0.png</url>
      <title>DEV Community: zinverno</title>
      <link>https://dev.to/zinverno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zinverno"/>
    <language>en</language>
    <item>
      <title>I Built an Obsidian Plugin to Audit an Entire Vault with AI. Here's How It Works</title>
      <dc:creator>zinverno</dc:creator>
      <pubDate>Sat, 08 Aug 2026 08:50:58 +0000</pubDate>
      <link>https://dev.to/zinverno/i-built-an-obsidian-plugin-to-audit-an-entire-vault-with-ai-heres-how-it-works-58an</link>
      <guid>https://dev.to/zinverno/i-built-an-obsidian-plugin-to-audit-an-entire-vault-with-ai-heres-how-it-works-58an</guid>
      <description>&lt;p&gt;Most Obsidian vaults start simple.&lt;/p&gt;

&lt;p&gt;A few folders. A few dozen notes. Some links. Maybe a graph that still looks understandable.&lt;/p&gt;

&lt;p&gt;Then you keep using it.&lt;/p&gt;

&lt;p&gt;A few hundred notes later, the situation changes.&lt;/p&gt;

&lt;p&gt;You have notes you forgot existed, topics described three different ways, orphan files, inconsistent tags, half-finished ideas, duplicated concepts, and useful information that you remember writing but can no longer find.&lt;/p&gt;

&lt;p&gt;At some point I started thinking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I could audit an Obsidian vault almost like you would audit a codebase?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;Vault Audit AI&lt;/strong&gt;, a free and open-source Obsidian plugin.&lt;/p&gt;

&lt;p&gt;It can analyze the structure and content of a vault, generate recommendations, create an Obsidian Canvas with the results, build a semantic search index, and process notes in batches.&lt;/p&gt;

&lt;p&gt;But building it introduced an interesting problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you analyze an entire knowledge base when it doesn't fit into a single LLM context window?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The naive approach
&lt;/h2&gt;

&lt;p&gt;The obvious implementation would be something like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read every Markdown file.&lt;/li&gt;
&lt;li&gt;Concatenate everything.&lt;/li&gt;
&lt;li&gt;Send it to an LLM.&lt;/li&gt;
&lt;li&gt;Ask for recommendations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This works surprisingly well for tiny vaults.&lt;/p&gt;

&lt;p&gt;It also falls apart surprisingly quickly.&lt;/p&gt;

&lt;p&gt;If a vault contains hundreds or thousands of notes, several problems appear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;context becomes too large&lt;/li&gt;
&lt;li&gt;inference becomes expensive&lt;/li&gt;
&lt;li&gt;important details disappear inside a huge prompt&lt;/li&gt;
&lt;li&gt;one failed request can ruin the entire audit&lt;/li&gt;
&lt;li&gt;there is no useful intermediate representation&lt;/li&gt;
&lt;li&gt;re-running the audit means processing everything again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I needed another approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treating the vault as a dataset
&lt;/h2&gt;

&lt;p&gt;Instead of thinking of the vault as one giant document, I started treating it as a collection of smaller documents.&lt;/p&gt;

&lt;p&gt;The audit pipeline can analyze notes individually or in batches and then combine those intermediate results into a higher-level representation of the vault.&lt;/p&gt;

&lt;p&gt;Conceptually, it looks like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vault
  |
  |-- Note 1 --&amp;gt; analysis --\
  |-- Note 2 --&amp;gt; analysis ---|
  |-- Note 3 --&amp;gt; analysis ---|--&amp;gt; global analysis
  |-- ...                    |
  \-- Note N --&amp;gt; analysis --/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It is basically a MapReduce-style approach.&lt;/p&gt;

&lt;p&gt;The "map" stage extracts useful information from smaller pieces of the vault.&lt;/p&gt;

&lt;p&gt;The "reduce" stage combines those outputs and asks questions about the knowledge base as a whole:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What thematic clusters exist?&lt;/li&gt;
&lt;li&gt;Which areas are weakly connected?&lt;/li&gt;
&lt;li&gt;Which notes appear redundant?&lt;/li&gt;
&lt;li&gt;Where is organization inconsistent?&lt;/li&gt;
&lt;li&gt;Which notes should probably be linked?&lt;/li&gt;
&lt;li&gt;What structural changes would make the vault easier to navigate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This avoids requiring the complete raw vault to exist inside one prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three audit modes
&lt;/h2&gt;

&lt;p&gt;I eventually kept several modes because they solve slightly different problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single Audit&lt;/strong&gt; processes notes individually and can maintain incremental audit state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single Full&lt;/strong&gt; analyzes everything from scratch when you want a complete reset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batch + Report&lt;/strong&gt; is the deeper MapReduce-style pipeline that combines batch analysis with global insights.&lt;/p&gt;

&lt;p&gt;[INSERT SCREENSHOT: AUDIT MODE SELECTION]&lt;/p&gt;

&lt;p&gt;For a small vault, the difference is not dramatic.&lt;/p&gt;

&lt;p&gt;For a large vault, the architecture becomes much more important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning the analysis into something useful
&lt;/h2&gt;

&lt;p&gt;Another thing I didn't want was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI analysis completed. Here are 4,000 words inside a modal window. Good luck.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The result should become part of the vault itself.&lt;/p&gt;

&lt;p&gt;So Vault Audit AI can create a Markdown audit dashboard.&lt;/p&gt;

&lt;p&gt;For example, I created a small English demo vault with 47 notes covering AI systems, engineering, product development, research, and a few fictional projects.&lt;/p&gt;

&lt;p&gt;I intentionally added problems to it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orphan notes&lt;/li&gt;
&lt;li&gt;inconsistent tags&lt;/li&gt;
&lt;li&gt;overlapping topics&lt;/li&gt;
&lt;li&gt;weakly connected areas&lt;/li&gt;
&lt;li&gt;old notes that conflict with newer thinking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The plugin generated this dashboard:&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%2F0m8lukoc3rvry5xub0yn.png" 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%2F0m8lukoc3rvry5xub0yn.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case it identified several major clusters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Core &amp;amp; RAG&lt;/li&gt;
&lt;li&gt;Engineering &amp;amp; Infrastructure&lt;/li&gt;
&lt;li&gt;Product Strategy &amp;amp; Growth&lt;/li&gt;
&lt;li&gt;Cognitive Research&lt;/li&gt;
&lt;li&gt;Active Projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also found structural issues and generated reorganization recommendations.&lt;/p&gt;

&lt;p&gt;The important part is that the output remains a normal Markdown file.&lt;/p&gt;

&lt;p&gt;You can edit it, link to it, search it, version it with Git, or simply delete it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating an Obsidian Canvas
&lt;/h2&gt;

&lt;p&gt;I also wanted a more visual representation.&lt;/p&gt;

&lt;p&gt;The audit can generate an Obsidian Canvas containing statistics, folder structure, and AI recommendations.&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%2Fuo9rpbt9rgj9sdj9qn50.png" 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%2Fuo9rpbt9rgj9sdj9qn50.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I like this approach because the analysis does not create some proprietary dashboard outside Obsidian.&lt;/p&gt;

&lt;p&gt;The result is still an Obsidian artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Semantic search
&lt;/h2&gt;

&lt;p&gt;Auditing solves one problem.&lt;/p&gt;

&lt;p&gt;Finding things is another.&lt;/p&gt;

&lt;p&gt;Traditional search works well when you remember the words you used.&lt;/p&gt;

&lt;p&gt;Humans, unfortunately, tend to remember ideas instead.&lt;/p&gt;

&lt;p&gt;You might remember:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I wrote something about debugging AI systems in production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the actual note might be called:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Observability for AI Systems&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;There may not be an exact keyword match for your query.&lt;/p&gt;

&lt;p&gt;So I added optional semantic search.&lt;/p&gt;

&lt;p&gt;The plugin creates embeddings for Markdown content and stores a persistent local index.&lt;/p&gt;

&lt;p&gt;A query is embedded using the same model and compared with the indexed content.&lt;/p&gt;

&lt;p&gt;In my demo vault I searched for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ways to make an LLM workflow easier to debug in production&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The highest results were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observability for AI Systems&lt;/li&gt;
&lt;li&gt;Testing LLM Integrations&lt;/li&gt;
&lt;li&gt;Prompt Engineering&lt;/li&gt;
&lt;li&gt;AI Feature Launch Checklist&lt;/li&gt;
&lt;/ul&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%2Fiu7gqultu0en92zbc6vq.png" 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%2Fiu7gqultu0en92zbc6vq.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I like about this example is that the query never says "observability."&lt;/p&gt;

&lt;p&gt;The system still finds the note because the concepts are related.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use a vector database?
&lt;/h2&gt;

&lt;p&gt;For a personal Obsidian vault, I didn't want the first version to require another server or database.&lt;/p&gt;

&lt;p&gt;The current implementation therefore keeps the semantic index locally and performs a simple similarity scan.&lt;/p&gt;

&lt;p&gt;That has an obvious trade-off.&lt;/p&gt;

&lt;p&gt;It is easy to understand, portable, and perfectly usable for smaller knowledge bases.&lt;/p&gt;

&lt;p&gt;It is not the architecture I would choose for millions of vectors.&lt;/p&gt;

&lt;p&gt;For much larger indexes, something like HNSW or another approximate nearest-neighbor structure would make more sense.&lt;/p&gt;

&lt;p&gt;But one principle I tried to follow while building the plugin was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't introduce infrastructure until the problem actually requires it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A personal knowledge base is not Google Search.&lt;/p&gt;

&lt;p&gt;At least, mine isn't.&lt;/p&gt;

&lt;p&gt;Yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embeddings are optional
&lt;/h2&gt;

&lt;p&gt;I also didn't want installing the plugin to silently start embedding someone's entire vault.&lt;/p&gt;

&lt;p&gt;Semantic functionality is therefore optional.&lt;/p&gt;

&lt;p&gt;The user explicitly enables it, chooses an embedding provider, and builds the index.&lt;/p&gt;

&lt;p&gt;Language-model inference and embeddings can also use different providers.&lt;/p&gt;

&lt;p&gt;The plugin currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenRouter&lt;/li&gt;
&lt;li&gt;OpenAI&lt;/li&gt;
&lt;li&gt;Groq&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;custom OpenAI-compatible endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So it is possible, for example, to use one remote model for generation and another model for embeddings.&lt;/p&gt;

&lt;p&gt;Or use Ollama if you prefer local inference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch processing
&lt;/h2&gt;

&lt;p&gt;Once the plugin already knew how to traverse and process a vault, another feature became fairly natural.&lt;/p&gt;

&lt;p&gt;Batch operations.&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%2Fncfod2e234khpoi93qtf.png" 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%2Fncfod2e234khpoi93qtf.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can select notes using folder, tag, or date filters and run operations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;improve writing style&lt;/li&gt;
&lt;li&gt;summarize&lt;/li&gt;
&lt;li&gt;add examples&lt;/li&gt;
&lt;li&gt;generate tags&lt;/li&gt;
&lt;li&gt;add summaries&lt;/li&gt;
&lt;li&gt;fix grammar&lt;/li&gt;
&lt;li&gt;generate flashcards&lt;/li&gt;
&lt;li&gt;run a custom prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is an important UX problem here though.&lt;/p&gt;

&lt;p&gt;AI plus batch processing can become dangerous very quickly.&lt;/p&gt;

&lt;p&gt;"Improve all 2,000 notes" sounds convenient right until you realize that the model enthusiastically improved something you wanted to keep exactly as it was.&lt;/p&gt;

&lt;p&gt;So I think bulk AI operations should remain visible and deliberate rather than becoming invisible background magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The vault as both a graph and a semantic space
&lt;/h2&gt;

&lt;p&gt;One thing I found particularly interesting while building this is that Obsidian effectively gives us two different representations of knowledge.&lt;/p&gt;

&lt;p&gt;The first is explicit:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Note A --&amp;gt; [[Note B]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Humans created those relationships intentionally.&lt;/p&gt;

&lt;p&gt;The second is implicit:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;embedding(Note A) ≈ embedding(Note C)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Those notes may be conceptually related even if nobody linked them.&lt;/p&gt;

&lt;p&gt;These representations are useful for different reasons.&lt;/p&gt;

&lt;p&gt;Links tell us what relationships the author explicitly recognized.&lt;/p&gt;

&lt;p&gt;Embeddings can expose relationships that may have been missed.&lt;/p&gt;

&lt;p&gt;Combining both makes vault analysis much more interesting than simply sending Markdown to an LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things that still need improvement
&lt;/h2&gt;

&lt;p&gt;The plugin is far from finished.&lt;/p&gt;

&lt;p&gt;A few areas I want to improve:&lt;/p&gt;

&lt;h3&gt;
  
  
  Incremental semantic indexing
&lt;/h3&gt;

&lt;p&gt;The semantic index currently requires explicit updates.&lt;/p&gt;

&lt;p&gt;Eventually I'd like file changes to update only the affected parts of the index.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better similarity search for large vaults
&lt;/h3&gt;

&lt;p&gt;The current local scan is intentionally simple.&lt;/p&gt;

&lt;p&gt;An ANN index would make more sense once vault size makes exhaustive similarity comparisons expensive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better evaluation
&lt;/h3&gt;

&lt;p&gt;This is probably the biggest one.&lt;/p&gt;

&lt;p&gt;AI recommendations can sound reasonable while being useless.&lt;/p&gt;

&lt;p&gt;I want to build better ways to measure whether audit recommendations actually improve a real vault rather than merely producing convincing text.&lt;/p&gt;

&lt;h3&gt;
  
  
  More real-world vaults
&lt;/h3&gt;

&lt;p&gt;Synthetic demo vaults are useful for testing predictable failure cases.&lt;/p&gt;

&lt;p&gt;Real personal knowledge bases are much stranger.&lt;/p&gt;

&lt;p&gt;That's exactly why I'm interested in seeing what the plugin finds in them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The project
&lt;/h2&gt;

&lt;p&gt;Vault Audit AI is currently completely free and open source.&lt;/p&gt;

&lt;p&gt;It is already available in the official Obsidian Community Plugins directory.&lt;/p&gt;

&lt;p&gt;You can install it from:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Settings → Community plugins → Browse → search for "Vault Audit AI"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Community Plugins page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.obsidian.md/plugins/ai-knowledge-hub" rel="noopener noreferrer"&gt;https://community.obsidian.md/plugins/ai-knowledge-hub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you use Obsidian and have an old, messy, or simply very large vault, I'd be particularly interested in what the audit finds.&lt;/p&gt;

&lt;p&gt;I'm also curious how other people approach this problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you keep a knowledge base understandable once it grows beyond the point where you can remember what's inside it?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>obsidian</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
