- Personal project
- In active development
Nexa
Multi-tenant AI knowledge & research assistant
Organizations upload private PDF knowledge, ask questions about it, optionally add public web research, and receive grounded answers with citations. I am building it to gain real, end-to-end experience with RAG and LLM systems in a production-oriented architecture, going well beyond a basic "upload a PDF and ask a chatbot" demo.
Working today
- End-to-end RAG flow: PDF upload, text extraction, chunking with overlap, OpenAI embeddings, pgvector similarity search, and answers with document citations.
- Three research modes: internal documents, public web research, or both combined, each with source citations.
- JWT authentication with tenant membership checks and tenant-scoped document queries.
- React and TypeScript UI for login, document upload and management, and RAG chat.
How a question is answered
- Authenticated user & tenant context
- PDF upload & text extraction
- Chunking with overlap
- Embeddings stored in pgvector
- Tenant-scoped vector search
- Optional public web research
- LLM answer with citations
Project: Nexa – multi-tenant AI knowledge and research assistant
Type: Personal, independent project (not part of any employment)
Status: In active development – the main end-to-end flow works; roughly 40–45% of the planned MVP
Why I am building it
I understood React, TypeScript, RAG, embeddings, vector search and LLMs conceptually, and wanted real hands-on experience building an AI system end to end, including the parts that make it production-oriented: multi-tenant security, tenant-isolated retrieval, asynchronous processing and reliability.
What works today
- Journey working end to end: login, PDF upload, text extraction, chunking, embedding generation, vector storage, tenant-scoped search, RAG answer, citations.
- NestJS backend with Prisma and PostgreSQL/pgvector; PDF upload, download and delete.
- OpenAI embeddings and vector similarity search over document chunks.
- Internal-document RAG, public web research, and combined internal-plus-web answers, with document and web citations.
- JWT authentication, tenant membership checks and tenant-scoped document queries (basic implementation; hardening planned).
- React and TypeScript frontend with login, document upload and list, and RAG chat UI.
- Docker Compose environment for PostgreSQL with pgvector and Redis.
Architecture decisions
- Tenant isolation is a backend security boundary: every request's tenant is verified against the authenticated user's membership before any data access.
- PostgreSQL with pgvector holds relational and vector data in one database instead of adding a separate vector store.
- Modular monolith with a separate background worker (currently scaffolded) rather than microservices: runtime responsibilities differ, but the MVP does not justify extra operational complexity.
- Provider abstractions are planned so LLM, embedding and web-search integrations can become replaceable.
- Retrieved documents and web content are treated as data, never as instructions, as part of the prompt-injection design.
Next milestones
- Asynchronous, Redis-backed document processing with retries and idempotency
- Tenant-level RAG and web-research configuration, and admin/member roles
- Input validation, error handling, structured logging and conversation history
- Automated frontend and backend tests
- Production Docker setup and AWS deployment
Technologies used
- Frontend: React, TypeScript
- Backend: Node.js, NestJS, Prisma
- Data: PostgreSQL, pgvector
- AI: OpenAI embeddings, LLM integration, web-search provider
- Local environment: Docker Compose (PostgreSQL, pgvector, Redis)