<?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: joungminsung</title>
    <description>The latest articles on DEV Community by joungminsung (@joungminsung).</description>
    <link>https://dev.to/joungminsung</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3847160%2Febe7a8b7-7a67-41c3-be36-e92f812b4d4c.png</url>
      <title>DEV Community: joungminsung</title>
      <link>https://dev.to/joungminsung</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joungminsung"/>
    <language>en</language>
    <item>
      <title>I built a RAG platform because I was tired of spending 15 minutes searching for team docs</title>
      <dc:creator>joungminsung</dc:creator>
      <pubDate>Sat, 28 Mar 2026 06:58:41 +0000</pubDate>
      <link>https://dev.to/joungminsung/i-built-a-rag-platform-because-i-was-tired-of-spending-15-minutes-searching-for-team-docs-5f3b</link>
      <guid>https://dev.to/joungminsung/i-built-a-rag-platform-because-i-was-tired-of-spending-15-minutes-searching-for-team-docs-5f3b</guid>
      <description>&lt;h2&gt;
  
  
  It Started with a Simple Frustration
&lt;/h2&gt;

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

&lt;p&gt;During a project, when a teammate asked "Where's the deployment process documented?", I couldn't answer right away either. Was it in the GitHub Wiki? Notion? Or Confluence?&lt;/p&gt;

&lt;p&gt;I ended up spending over 10 minutes finding and sending the link, and I realized I was repeating this every time. The docs were definitely somewhere, but the process of finding them was incredibly inefficient.&lt;/p&gt;

&lt;p&gt;So I started building it myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenDocuments
&lt;/h2&gt;

&lt;p&gt;In one line: &lt;strong&gt;a tool that connects documents scattered across multiple places and answers natural language questions with sources&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;GitHub repos ──┐
Notion pages ──┤    ┌──────────┐
Google Drive ──┤──► │ Parse    │    "How does auth work?"
Confluence   ──┤    │ Chunk    │           │
S3 buckets   ──┤    │ Embed    │           ▼
Local files  ──┘    └────┬─────┘    ┌──────────┐
                         │          │ RAG      │
                   ┌─────┴─────┐    │ Search   │
                   │ SQLite    │◄───│ Rerank   │
                   │ LanceDB   │    │ Generate │
                   └───────────┘    └────┬─────┘
                                         │
                                    "It's JWT-based and
                                     uses a refresh flow.
                                     [Source: auth.md]"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Connectors
&lt;/h2&gt;

&lt;p&gt;I built these around the tools teams actually use.&lt;/p&gt;

&lt;p&gt;GitHub, Notion, Google Drive, S3, Confluence, Swagger, web crawler, and even Tavily web search. Local files work of course, and you can drag-and-drop upload through the web UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  File Formats
&lt;/h2&gt;

&lt;p&gt;This is where I honestly spent a lot of time yak-shaving. It supports 12 formats: PDF, DOCX, Excel, HTML, Jupyter Notebooks, email (.eml), source code, PPTX, JSON/YAML, and more.&lt;/p&gt;

&lt;p&gt;If a parser fails, a fallback chain automatically tries the next one. For example, if the PDF parser fails, the OCR parser takes over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local LLM
&lt;/h2&gt;

&lt;p&gt;This is personally what I consider the most important part.&lt;/p&gt;

&lt;p&gt;Through Ollama, you can run Qwen 3.5, Llama 4, DeepSeek V3.2, Gemma 3, EXAONE, and others locally. Running &lt;code&gt;opendocuments init&lt;/code&gt; checks your RAM and GPU and recommends a model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;--profile&lt;/span&gt; with-ollama up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# LLM, embeddings, vector search, web UI — all local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since no data leaves your machine, even security-conscious teams can adopt it. Of course, cloud models like OpenAI, Claude, Gemini, and Grok are also supported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Language Search (Korean/English)
&lt;/h2&gt;

&lt;p&gt;Ask in Korean and it finds English documents, and vice versa. I think this will be quite useful for multilingual teams.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opendocuments ask &lt;span class="s2"&gt;"What's the remote work policy for the Tokyo office?"&lt;/span&gt; &lt;span class="nt"&gt;--profile&lt;/span&gt; precise
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  RAG Pipeline
&lt;/h2&gt;

&lt;p&gt;It doesn't just do embedding search — I added several more stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Intent Classification&lt;/strong&gt; — Classifies whether it's a code question, conceptual question, or comparison&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Decomposition&lt;/strong&gt; — Queries like "Compare v2 and v3 specs" get split into sub-queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Search&lt;/strong&gt; — Combines vector search + FTS5 keyword search using RRF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reranking&lt;/strong&gt; — Re-orders search results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hallucination Guard&lt;/strong&gt; — Verifies each sentence in the answer is grounded in actual sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3-Tier Caching&lt;/strong&gt; — Query (5 min), embedding (24 hrs), web search (1 hr)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Honestly, there's still a lot to improve, but the basic pipeline is in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Server
&lt;/h2&gt;

&lt;p&gt;Many of you are probably using Claude Code or Cursor these days — connecting via the MCP server lets you search internal docs right while coding.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"opendocuments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"opendocuments"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--mcp-only"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Use
&lt;/h2&gt;

&lt;p&gt;There are three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web UI&lt;/strong&gt; — Chat, document management, admin dashboard (&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt; — 17 commands with pipe support for scripting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript SDK&lt;/strong&gt; — For integrating with other services&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;It grew quite a bit as I built it. Roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turborepo monorepo, TypeScript&lt;/li&gt;
&lt;li&gt;Server: Hono, Frontend: React + Vite + Tailwind&lt;/li&gt;
&lt;li&gt;Storage: SQLite + LanceDB&lt;/li&gt;
&lt;li&gt;51 test suites with around 300 tests&lt;/li&gt;
&lt;li&gt;Plugins: 9 parsers, 8 connectors, 5 models&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @opendocuments/cli
opendocuments init
opendocuments start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;init&lt;/code&gt; runs an interactive wizard that detects your hardware, recommends a model, and generates the config file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugins
&lt;/h2&gt;

&lt;p&gt;If you need a custom parser or connector, you can build your own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opendocuments plugin create my-parser &lt;span class="nt"&gt;--type&lt;/span&gt; parser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are four types — parser, connector, model, and middleware — with type interfaces and lifecycle hooks provided.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;There are surely still many shortcomings, but I'll actively incorporate any feedback. It's MIT licensed, and Stars, Issues, and PRs are all welcome.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/joungminsung/OpenDocuments" rel="noopener noreferrer"&gt;https://github.com/joungminsung/OpenDocuments&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>rag</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
