Chat with your documents or the live web: Verba vs Extract Chat
Ask questions of your own files with Verba and Weaviate, or of live web pages with Extract Chat and Firecrawl. What each deploys and which to pick.By chin · Nov 11, 2026 · 6 min read
A general chatbot knows a lot, but it has never read your handbook, your contracts or last quarter's reports. Ask it about them and it guesses. The fix is to give the model the right text at the moment you ask, and to show you where that text came from.
This post explains that idea in plain terms, then compares two Railway templates that do it in different ways: Verba, which answers from documents you upload, and Extract Chat, which answers from web pages it fetches while you chat.
RAG in one paragraph
Retrieval-augmented generation (RAG) has three steps. First, your documents are split into small chunks and each chunk is turned into a list of numbers called an embedding, which captures its meaning. Those embeddings live in a vector database. Second, when you ask a question, the question is embedded too, and the database returns the chunks closest in meaning. Third, the model writes an answer using only those chunks, and the app shows which ones it used.
The quality of the answer depends mostly on the first two steps: how documents are chunked and which embedding model you use. A good retrieval step with an average model usually beats a great model with poor retrieval.
| Job | Template | In one line |
|---|---|---|
| Ask questions about your own files | Verba | Upload PDFs, text and code, then chat with answers grounded in them |
| Ask questions about live web pages | Extract Chat | A chatbot that searches, scrapes and extracts data from websites as you ask |
Verba: RAG over your own files
Verba is an open-source RAG app from the team behind the Weaviate vector database. It gives you a web interface to import data, chat with it, and tune the pipeline, all without writing code.
The template deploys two services:
- Verba, the Python app and web interface, built from a fork of the upstream repository.
- Weaviate, the vector database, from the official
semitechnologies/weaviateimage, with a volume mounted at/var/lib/weaviateso your imported documents survive redeploys.
Verba reaches Weaviate over Railway's private network. The template sets
WEAVIATE_URL_VERBA on the Verba service to the Weaviate service's private address on port 8080, so you don't need to wire them together yourself.First run
- Deploy the template and paste an OpenAI key into
OPENAI_APIKEY. The Verba service picks it up asOPENAI_API_KEYthrough a reference variable. - Open the Verba service's public URL. The first screen asks which deployment mode to use.
- Choose Custom and enter the Weaviate service's private hostname with port
8080. You can copy the host fromWEAVIATE_URL_VERBAin the Verba service's variables. No API key is needed for this private connection. - Go to Import Data and add files, a directory or a URL. Each file can be configured on its own before import.
- Open Chat and ask a question. Verba shows the chunks it retrieved next to the answer, so you can check the source.
Settings worth knowing
- Chunking. Verba offers token, sentence, semantic and recursive chunking, plus dedicated splitters for HTML, Markdown, code and JSON. Try semantic or sentence chunking for prose and the code splitter for repositories.
- Embedding models. Supported providers include OpenAI, Cohere, VoyageAI, Upstage, Ollama and SentenceTransformers. Pick one before your first import and stick with it. The README warns that mixing embedding models with different vector sizes leads to errors.
- Generation models. Besides OpenAI, Verba can use Anthropic, Cohere, Groq, Novita and Ollama. Add
ANTHROPIC_API_KEY,GROQ_API_KEYorOLLAMA_URLto the Verba service to enable them. - Proxies.
OPENAI_BASE_URLpoints Verba at any OpenAI-compatible endpoint, such as a LiteLLM gateway. - Ingestion add-ons.
UNSTRUCTURED_API_KEYadds Unstructured for harder file types,FIRECRAWL_API_KEYlets you scrape and crawl URLs into Verba, andASSEMBLYAI_API_KEYtranscribes audio.GITHUB_TOKENis already a slot in the template for importing GitHub repositories. - Existing data. Verba cannot read data that is already in another Weaviate instance. Everything has to come in through its own importer.
Extract Chat: answers from the live web
Extract Chat is a fork of Vercel's open-source AI Chatbot with Firecrawl tools added. Instead of searching documents you've stored, the model can search the web, scrape a page, or extract structured data from several pages while it answers. That makes it the better fit when the information you need lives on websites and changes often: prices, release notes, directory listings, competitor pages.
It is not a document-upload RAG app. If your knowledge lives in PDFs on your laptop, Verba is the right tool.
The template deploys four services:
- app, the Next.js chatbot.
- Postgres, for users, chat history and saved documents, with a volume at
/var/lib/postgresql/data. - Redis, with a volume at
/bitnami. - http, a small service that exposes Redis over an Upstash-compatible REST API. The app uses it for rate limiting.
First run
- Add
OPENAI_API_KEYandFIRECRAWL_API_KEY. Both are required. - Leave
AUTH_SECRET,AUTH_URLandNEXTAUTH_URLas they are. The template generates the secret and fills in your public domain. - Open the app and start chatting. Ask something like "Find the pricing pages for these three tools and put the plans in a table", and the model calls Firecrawl's search, scrape or extract tools as needed.
Settings worth knowing
- Model. The default is OpenAI
gpt-4o. The AI SDK supports other providers, but switching means a small code change rather than a variable. - Rate limit. The chat route allows 5 requests per 60 seconds per user through the Redis rate limiter. Edit
lib/rate-limit.tsif that's too tight. - Anonymous access. Visitors who don't sign in are given an anonymous account automatically, so anyone with the URL can chat and spend your API credit.
- File uploads. The upload route uses Vercel Blob and expects
BLOB_READ_WRITE_TOKEN. The template doesn't set it, so leave uploads out of your plans unless you add a Blob token. - Postgres URL.
POSTGRES_URLpoints at the public Postgres URL. You can switch it to${{Postgres.DATABASE_URL}}to keep database traffic on the private network.
Which one do you need?
- Your own documents (policies, manuals, research papers, a code base): Verba. It stores them, shows retrieved chunks, and lets you tune chunking and models.
- Information that lives on websites and changes: Extract Chat. Nothing to import; it fetches pages when you ask.
- Both: run Verba and add a
FIRECRAWL_API_KEYto it, so you can pull selected web pages into the same knowledge base as your files.
If what you actually want is a general answer engine with citations, see Build a self-hosted Perplexity alternative. For a plain ChatGPT-style interface, see self-hosted ChatGPT alternatives.
Security and cost checklist
- Lock the front door. Verba's README does not describe user accounts, and Extract Chat creates anonymous users. Treat both URLs as public unless you put them behind authentication.
- Keep Weaviate private. The template enables anonymous access on Weaviate, which is fine on the private network. Don't add a public domain to the Weaviate service.
- Cap your keys. Set spending limits on your OpenAI and Firecrawl accounts. Large imports in Verba spend embedding tokens; every Extract Chat tool call spends Firecrawl credits.
- Back up volumes. Your Weaviate and Postgres volumes hold the work. Enable Railway volume backups before you rely on them.
Frequently asked questions
Do my documents leave my server?
The files and their embeddings are stored in your Weaviate volume. The text chunks are sent to whichever embedding and generation provider you choose. To keep everything in-house, point Verba at an Ollama instance you run yourself.
Which file types does Verba accept?
Text, Markdown, PDF, DOCX, CSV and XLSX, plus files from GitHub and GitLab repositories. Unstructured and Upstage add document parsing for harder files, and AssemblyAI adds audio.
Can Extract Chat read a PDF I upload?
Not with the template as deployed, because uploads need a Vercel Blob token. It is built for web pages.
Can I use Claude instead of OpenAI?
In Verba, yes, for generation: add
ANTHROPIC_API_KEY and pick it in the config. You still need a separate embedding provider, such as OpenAI, Cohere, VoyageAI or Ollama. In Extract Chat, switching providers requires a code change.Templates in this guide
More guides
- A self-hosted Trello alternative: Planka with S3 storage on RailwayRun Planka, an open-source kanban board, on Railway with Postgres and a MinIO bucket for attachments. The settings to change first, and when to pick it.
- Self-host bolt.diy: an open-source AI app builder on RailwayRun bolt.diy, the open-source Bolt.new, on Railway. Bring your own model keys, build web apps by chatting, and keep the keys safe.
- Build a self-hosted Perplexity alternative with Morphic, SearXNG and FirecrawlSelf-host an AI answer engine with cited sources. Compare Morphic, Open DeepResearch and Fireplexity, and add private search with SearXNG or Whoogle.

