EZLookUp is a full-stack RAG (Retrieval-Augmented Generation) app for asking questions over your own files. It supports:
- PDF ingestion and semantic search
- Audio ingestion (lecture/podcast style files) with Whisper transcription
- Streaming LLM responses from Groq
- User auth and metadata/history via Supabase
- Per-user document isolation with Chroma metadata filtering
- Frontend: Next.js (App Router), TypeScript, Tailwind CSS
- Backend: FastAPI, Python 3.11
- Vector DB: ChromaDB (persistent local data directory or mounted Docker volume)
- LLM + STT: Groq (
llama-3.1-8b-instant,whisper-large-v3) - Auth + metadata: Supabase
frontend/- Next.js UI and API proxy routesbackend/- FastAPI ingestion/query/voice endpointsdata/chroma/- persisted local Chroma data (when using Docker volume mapping)supabase/- local Supabase configdocker-compose.yml- backend container setup
- Fast ingestion pipeline
- PDF/audio chunking with batched
collection.add()inserts (batch size 50) - Content hash deduplication using SHA-256
- PDF/audio chunking with batched
- Low-latency retrieval
- Chroma semantic search with
user_idfilter - Streaming query endpoint (
/query/stream)
- Chroma semantic search with
- Voice-first querying
/voice-queryaccepts.m4aand.wav- Audio transcription through Groq Whisper
- User-aware data
- Supabase stores document metadata and chat history
- Queries scoped to each user's indexed chunks
Install these locally:
- Node.js 18+ (20+ recommended)
- npm
- Python 3.11+
- pip
- (Optional) Docker Desktop for containerized backend
You also need active keys/services for:
- Groq API
- Supabase project (URL + keys)
Create two env files:
GROQ_API_KEY=your_groq_api_key
SUPABASE_URL=https://your-project-ref.supabase.co
SUPABASE_KEY=your_supabase_service_role_or_server_key
CHROMA_PERSIST_DIR=./chroma_data
# Optional: protects POST /admin/nuke-all
NUCLEAR_SECRET=your_admin_secretNEXT_PUBLIC_API_URL=http://localhost:8000
NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_keycd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload --host 0.0.0.0 --port 8000Backend health check:
curl http://localhost:8000/Expected response:
{"status":"ok"}cd frontend
npm install
npm run devOpen:
http://localhost:3000
If you prefer containerized backend only:
docker compose up --build backendThis maps:
- local
./data/chroma-> container/data/chroma - backend on
http://localhost:8000
Then run frontend normally with NEXT_PUBLIC_API_URL=http://localhost:8000.
GET /- health checkPOST /upload- upload and index PDFPOST /upload/audio- upload/transcribe/index long-form audioPOST /query- non-streaming text answerPOST /query/stream- streaming text answerPOST /voice-query- ask by audio input (.m4a/.wav)POST /admin/nuke-all- admin-only destructive reset (requiresX-Admin-Secret)
- Sign up / sign in via Supabase auth.
- Upload a PDF or audio file.
- Backend extracts/transcribes, chunks, embeds, and indexes to Chroma.
- Ask a question by text or voice.
- Receive a response grounded in retrieved chunks; chat/history metadata is saved in Supabase.
- No
.envexample files are currently committed; use the templates above. - Voice recording/upload from the browser may require microphone permissions and HTTPS in some environments.
- Make sure your Supabase project has the
documentsandchat_historytables used by the app.