<?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: Toprak Bozbey</title>
    <description>The latest articles on DEV Community by Toprak Bozbey (@toprakkbozbeyy).</description>
    <link>https://dev.to/toprakkbozbeyy</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%2F4182222%2Fc24d6446-709c-400b-af1e-ad8cc971d691.jpeg</url>
      <title>DEV Community: Toprak Bozbey</title>
      <link>https://dev.to/toprakkbozbeyy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toprakkbozbeyy"/>
    <language>en</language>
    <item>
      <title>I got tired of piecing together local RAG stacks, so I built a 100% offline Enterprise RAG Boilerplate (Ollama + FastAPI + LangChain + React)</title>
      <dc:creator>Toprak Bozbey</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:49:52 +0000</pubDate>
      <link>https://dev.to/toprakkbozbeyy/i-got-tired-of-piecing-together-local-rag-stacks-so-i-built-a-100-offline-enterprise-rag-b2</link>
      <guid>https://dev.to/toprakkbozbeyy/i-got-tired-of-piecing-together-local-rag-stacks-so-i-built-a-100-offline-enterprise-rag-b2</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;Over the last few months, I’ve been heavily experimenting with local LLMs. Running a model via Ollama is incredibly easy now, but I realized that building a production-ready, full-stack RAG (Retrieval-Augmented Generation) application around it—one that non-technical users or businesses can actually use without data privacy concerns—is still a massive headache.&lt;/p&gt;

&lt;p&gt;Piecing together the backend, frontend, vector databases, orchestration, and making sure everything works smoothly in Docker takes days, if not weeks, of boilerplate setup.&lt;/p&gt;

&lt;p&gt;To solve this for my own projects (and for clients who refuse to send their sensitive documents to OpenAI), I built VaultRAG. I wanted to share the architecture and how I put it together.&lt;/p&gt;

&lt;p&gt;🛠️ The Tech Stack&lt;br&gt;
I wanted a stack that is modern, asynchronous, and completely isolated from the internet:&lt;/p&gt;

&lt;p&gt;LLM &amp;amp; Embeddings: Ollama (Running locally, mostly testing with Llama 3.1 and Qwen for text, and nomic-embed-text for embeddings).&lt;/p&gt;

&lt;p&gt;Backend: Python &amp;amp; FastAPI. It handles the async API routing and document uploads seamlessly.&lt;/p&gt;

&lt;p&gt;RAG Orchestration: LangChain. Handled the PDF parsing, text chunking, and vector store retrieval.&lt;/p&gt;

&lt;p&gt;Frontend: React (Tailwind CSS for styling). Kept it clean, resembling a modern chat interface so enterprise users feel right at home.&lt;/p&gt;

&lt;p&gt;Deployment: Docker &amp;amp; Docker Compose. Everything spins up together.&lt;/p&gt;

&lt;p&gt;⚙️ How It Works Under the Hood&lt;br&gt;
Document Ingestion: The user uploads a PDF via the React interface. FastAPI receives it, LangChain processes the text, splits it into chunks (using RecursiveCharacterTextSplitter to maintain context), and creates embeddings via Ollama.&lt;/p&gt;

&lt;p&gt;Vector Storage: The embeddings are stored locally.&lt;/p&gt;

&lt;p&gt;Retrieval &amp;amp; Generation: When a user asks a question, the backend retrieves the most relevant chunks, constructs the prompt, and streams the response back from the local LLM via Server-Sent Events (SSE) for that real-time typing effect.&lt;/p&gt;

&lt;p&gt;🚧 Biggest Challenges&lt;br&gt;
Getting Docker networking to play nicely with Ollama was initially tricky. Ensuring the FastAPI container could communicate with the host's Ollama instance (or a containerized one) required specific network configurations.&lt;br&gt;
Also, tweaking the chunk size and overlap in LangChain was crucial; too small, and the LLM loses context; too large, and inference slows down significantly on local hardware.&lt;/p&gt;

&lt;p&gt;🚀 Try It Out&lt;br&gt;
I decided to package this entire architecture into a ready-to-use boilerplate. If you are building AI tools for clients, participating in hackathons, or just want a private AI for your own documents without spending a week on setup, you can use this as your foundation.&lt;/p&gt;

&lt;p&gt;If you want to see some of the open-source components/documentation, check out the GitHub repo: &lt;a href="https://github.com/toprakkbozbeyy/vaultrag-enterprise-starter-kit" rel="noopener noreferrer"&gt;https://github.com/toprakkbozbeyy/vaultrag-enterprise-starter-kit&lt;/a&gt;&lt;br&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%2Fl45meqmxg30myqf98qjh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl45meqmxg30myqf98qjh.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts on the stack. Has anyone else found a better way to handle local vector storage without bloating the Docker image? Open to all feedback and architectural roasting!&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>llm</category>
      <category>rag</category>
      <category>react</category>
    </item>
  </channel>
</rss>
