Tech Specs
A modern RAG architecture, built to be self-hosted
Architecture at a glance
ManualNinja is a single-tenant-friendly RAG application with a Python backend, a React SPA frontend, a PostgreSQL database and a Qdrant vector store. PDFs are parsed, chunked, embedded and served as cited answers through a chat interface.
Backend API
FastAPI 0.115 (Python), Uvicorn
Database
PostgreSQL + SQLAlchemy 2.0 ORM
Vector store
Qdrant (cosine similarity)
Embeddings
BAAI/bge-small-en-v1.5 (sentence-transformers, CPU)
LLM
DeepSeek-v3-0324 or any OpenAI-compatible you want (enterprise level)
PDF parsing
PyMuPDF 1.25 (per-page text extraction)
Chunking
1,200 chars per chunk, 150 char overlap
Auth
JWT (python-jose) + bcrypt password hashing
Billing
Stripe subscriptions + webhooks
Frontend
React 19, Vite 8, React Router 7, Axios
Email
SMTP transactional email + verification
Bot protection
Google reCAPTCHA on signup
How the RAG pipeline works
Ingestion
On upload, PyMuPDF extracts text page by page. Each page is split into overlapping 1,200-character chunks that keep their page number as metadata.
Embedding
Chunks are encoded with the BGE-small-en-v1.5 model and L2-normalized, then upserted into Qdrant with manual, manufacturer, model and organization metadata.
Retrieval
A question is embedded and Qdrant returns the top-k (default 6) most similar chunks, filtered by organization and optionally manufacturer/model.
Generation
Retrieved chunks are assembled into a context prompt with a strict system instruction to answer only from the manuals and to cite sources.
Citations
Each returned citation carries the manual id, manufacturer, model, title, page number and a snippet, rendered inline for the technician.
Security & multi-tenancy
Tenant isolation
Every vector point carries an org_id; retrieval is always filtered by organization so data never crosses tenants.
JWT auth
Stateless token authentication with configurable expiry (default 7 days) and bcrypt-hashed passwords.
Role hierarchy
Organization admins manage their team and manuals; a superadmin manages the platform, settings and all organizations.
Infrastructure requirements
Compute
Runs comfortably on a small VPS. Embedding runs on CPU; the LLM is called remotely via Novita AI, so no GPU is required.
Dependencies
PostgreSQL, Qdrant (bundled binary or managed), and an outbound connection to the Novita AI API.
Storage
Uploaded PDFs are stored on the local filesystem; vectors live in Qdrant; metadata and chat history in PostgreSQL.
Deployment
The React SPA is built with Vite and served as static assets by the FastAPI backend — a single deployable process.
Ready to put your manuals to work?
Start free in minutes. Upload your first manual and ask your first question today — no credit card required.