---
title: "Discussion on \"A $0 RAG chatbot for your personal site: Qdrant vs Upstash Vector\" | Hashnode"
description: "Discussion on \"A $0 RAG chatbot for your personal site: Qdrant vs Upstash Vector\". Two setups that run entirely on free tiers, built side by side with only the vector database swapped"
url: "https://hashnode.com/posts/a-0-rag-chatbot-for-your-personal-site-qdrant-vs-upstash-vector/6ad249c5f555a579d73c86cd"
---

[Feed](https://hashnode.com/feed) /

Discussion

# [A $0 RAG chatbot for your personal site: Qdrant vs Upstash Vector](https://itshuzaifa.hashnode.dev/a-0-rag-chatbot-for-your-personal-site-qdrant-vs-upstash-vector?utm_source=hashnode&utm_medium=feed)

Two setups that run entirely on free tiers, built side by side with only the vector database swapped

Oct 16 · 20 min read · itshuzaifa.hashnode.dev  
Updated Oct 27  
Read the article

-   [#rag](https://hashnode.com/tag/rag)
-   [#ai](https://hashnode.com/tag/ai)
-   [#python](https://hashnode.com/tag/python)
-   [#vector-database](https://hashnode.com/tag/vector-database)
-   [#llm](https://hashnode.com/tag/llm)

## Written by

[Huzaifa Khan](https://hashnode.com/@huzaifa207)

@huzaifa207 · Lahore, Pakistan

  
[View profile](https://hashnode.com/@huzaifa207)

Full-stack engineer building web and desktop apps, AI backends, and secure cloud

I build products end to end: desktop apps in Rust and Tauri, real-time backends in Node.js, and AWS infrastructure defined in Terraform. I write about what I learn shipping them, from shrinking desktop apps to locking down cloud access. More at itshuzaifa.com.

## Responses 2

Markdown supported · ⌘↵ to post

[Rose Alvina](https://hashnode.com/@rosealvinanex)

[Oct 17](https://hashnode.com/posts/a-0-rag-chatbot-for-your-personal-site-qdrant-vs-upstash-vector/6ad249c5f555a579d73c86cd/comment/6ad2fedd874abf8e984c78a4)

Useful comparison, especially the point that the pipeline matters more than the database. One thing worth adding for anyone copying this setup: the "Keeping the index in sync" step gets much cheaper if you store a content hash per chunk as payload/metadata. On each deploy, re-chunk the pages, hash each chunk (heading path + text), and only upsert chunks whose hash changed, then delete IDs that no longer exist. Using a deterministic ID like hash(url + heading) means re-runs are idempotent, so you never end up with duplicate vectors. On Upstash that also keeps you far below the daily write cap, since a typical edit touches two or three chunks rather than the whole site. I'd also log every question that returns a low top score; that list is the best guide to which pages need rewriting or extra chunks.

[Huzaifa Khan](https://hashnode.com/@huzaifa207)

[Oct 18](https://hashnode.com/posts/a-0-rag-chatbot-for-your-personal-site-qdrant-vs-upstash-vector/6ad249c5f555a579d73c86cd/comment/6ad2fedd874abf8e984c78a4#reply-6ad52ffcc81942695a4cef38)

Thanks, [Rose Alvina](https://hashnode.com/@rosealvinanex "Rose Alvina") , this is a great addition. The content hash per chunk is the right way to handle sync. My current setup re-embeds more than it needs to on each deploy, so hashing heading path + text and only upserting what changed would cut both embedding calls and writes. The deterministic ID (url + heading) is a nice touch too, since it makes re-runs idempotent and avoids duplicate vectors. And you’re right that on Upstash’s free tier, staying well under the daily write cap matters.

The low-score logging idea is my favorite part. Treating those queries as a list of content gaps turns the chatbot into a feedback loop for the site itself, not just a search box. I’ll likely add this to the pipeline. Appreciate you taking the time to write this up!
