NotebookLM, but smarter.
An open-source NotebookLM alternative. Free to use, fork, and self-host.
Thank you Delta Exchange for believing in NoobBook from day one.
GrowthX - The community that helped shape this journey.
Built with: Claude & Claude Code | OpenAI | ElevenLabs | Pinecone | Tavily | Google AI
Powered by open-source: React | Vite | Flask | shadcn/ui | Tailwind CSS | Radix UI
- What is NoobBook?
- How It Works
- Architecture
- Getting Started (Docker Setup)
- Local Development
- Tech Stack
- Contributing
- License
NoobBook is a fully-featured NotebookLM alternative that you can run yourself. Upload documents, chat with your sources using RAG, and generate content with AI agents.
Core Features:
- Multi-modal source ingestion (PDF, DOCX, PPTX, images, audio, YouTube, URLs)
- RAG-powered chat with citations
- AI-generated content (audio overviews, mind maps, presentations, and more)
- Memory system for personalized responses
- Voice input and text-to-speech
NoobBook has 4 main concepts:
Everything is organized into projects. Each project has its own sources, chats, and studio outputs.
Upload documents and the system processes them for AI understanding:
| Source Type | Processing |
|---|---|
| AI vision extracts text page by page | |
| DOCX | Python extraction |
| PPTX | Convert to PDF, then vision extraction |
| Images | AI vision describes content |
| Audio | ElevenLabs transcription |
| YouTube | Transcript API |
| URLs | Web agent fetches and extracts content |
| Text | Direct input |
Processing Pipeline:
Upload -> Raw file saved -> AI extracts text -> Chunked for RAG -> Embedded in Pinecone
RAG-powered Q&A with your sources:
User question
-> AI searches relevant sources (hybrid: keyword + semantic)
-> AI generates response with citations
-> Citations link to specific chunks
Key features:
- Chunk-based citations
- Memory system (user preferences + project context)
- Voice input via ElevenLabs
- Conversation history per chat
Generate content from your sources using AI agents:
| Category | Studio Items |
|---|---|
| Audio/Video | Audio Overview, Video Generation |
| Learning | Flash Cards, Mind Maps, Quizzes |
| Documents | PRD, Blog Posts, Business Reports, Presentations |
| Marketing | Ad Creatives, Social Posts, Email Templates |
| Design | Websites, Components, Wireframes, Flow Diagrams |
Frontend (React + Vite)
|
v
Backend API (Flask + SocketIO)
|
├── Source Processing (upload, extract, chunk, embed)
├── Chat Service (RAG search, Claude API, citations)
├── Studio Services (content generation agents)
└── Integrations (Claude, OpenAI, Pinecone, ElevenLabs, Gemini)
|
v
Supabase (PostgreSQL + S3 Storage + Auth)
AI Services:
- Claude - Main LLM for chat, agents, content generation
- OpenAI - Embeddings for vector search
- Pinecone - Vector database for RAG
- ElevenLabs - Text-to-speech and transcription
- Gemini - Image generation
- Google Veo - Video generation
Docker is the recommended way to run NoobBook. One script starts everything — Supabase, PostgreSQL, database migrations, backend, and frontend (16 containers total).
Before you begin, make sure you have:
| Requirement | Install | Check |
|---|---|---|
| Docker Desktop | docs.docker.com/get-docker | docker info |
| Docker Compose v2 | Included with Docker Desktop | docker compose version |
| Python 3 | brew install python3 (macOS) / sudo apt install python3 (Ubuntu) |
python3 --version |
Important: Docker Desktop must be running (not just installed). Open it from your Applications before running setup.
Ports required (must be free):
| Port | Used by |
|---|---|
80 |
NoobBook frontend (nginx) |
5001 |
NoobBook backend API |
8000 |
Supabase API gateway |
5432 |
PostgreSQL |
The setup script checks these automatically and will tell you if something is already using a port.
Get these before running setup:
| Key | Where to get it | Required? |
|---|---|---|
ANTHROPIC_API_KEY |
console.anthropic.com | Yes |
OPENAI_API_KEY |
platform.openai.com | Yes |
PINECONE_API_KEY + PINECONE_INDEX_NAME |
pinecone.io | Yes |
ELEVENLABS_API_KEY |
elevenlabs.io | No — audio features |
TAVILY_API_KEY |
tavily.com | No — web search fallback |
GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET |
Google Cloud Console | No — Google Drive import |
JIRA_CLOUD_ID (or JIRA_DOMAIN) + JIRA_EMAIL + JIRA_API_KEY |
Jira Settings → Security → API tokens | No — Jira integration |
NOTION_API_KEY |
Notion Integrations | No — Notion integration |
NANO_BANANA_API_KEY |
Google AI Studio | No — Gemini image generation |
VEO_API_KEY |
Google AI Studio | No — Video generation |
# Clone the repo
git clone https://github.com/TeacherOp/NoobBook.git
cd NoobBook
git checkout develop
# Copy env template
cp docker/.env.example docker/.envEdit docker/.env and add your API keys:
nano docker/.envAt minimum, fill in these four:
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
PINECONE_API_KEY=...
PINECONE_INDEX_NAME=...
Auth is enabled by default. You need to configure an admin account before running setup.
In docker/.env, set your admin credentials:
# Admin email(s) — these users get admin role on signup
NOOBBOOK_ADMIN_EMAILS=you@company.com
# Bootstrap admin — auto-creates this admin account on startup
NOOBBOOK_BOOTSTRAP_ADMIN_EMAIL=admin@example.com
NOOBBOOK_BOOTSTRAP_ADMIN_PASSWORD=YourSecurePassword123!How it works: The bootstrap admin is created automatically when the app starts. You'll use these credentials to log in at
http://localhost. Any other user who signs up gets theuserrole (can chat, use studio, manage projects). Admins can additionally manage app settings and API keys.
bash docker/setup.shThis will:
- Check prerequisites (Docker running, ports free, python3 available)
- Generate Supabase secrets (JWT tokens, database passwords)
- Create the Docker network
- Start Supabase services (PostgreSQL, Auth, Storage, API gateway)
- Build and start NoobBook (backend, frontend, database migration)
First run takes 3-5 minutes (downloading images + building). Subsequent runs are faster (cached).
Already ran setup before? If you've previously set up NoobBook and something isn't working, do a full reset first so everything starts fresh:
bash docker/reset.sh -v bash docker/setup.sh
When you see this, you're good:
============================================
NoobBook is running!
============================================
App: http://localhost
Supabase Studio: http://localhost:8000
Open http://localhost and sign in with the bootstrap admin credentials you set in Step 2.
NoobBook has two roles:
- admin — can view/update API keys, manage app settings, plus everything a user can do
- user — can chat, use studio, upload sources, and manage projects
Auth settings in docker/.env:
| Variable | Description |
|---|---|
NOOBBOOK_AUTH_REQUIRED=true |
Requires login for all API routes (default: true) |
NOOBBOOK_ADMIN_EMAILS=a@b.com,c@d.com |
These emails get admin role on signup |
NOOBBOOK_BOOTSTRAP_ADMIN_EMAIL |
Auto-creates this admin on startup |
NOOBBOOK_BOOTSTRAP_ADMIN_PASSWORD |
Password for the bootstrap admin |
NOOBBOOK_BOOTSTRAP_ADMIN_FORCE_RESET=true |
Reset the bootstrap admin password if account already exists |
First signup rule: If no admins exist yet, the first user to sign up automatically becomes admin (even without being in
NOOBBOOK_ADMIN_EMAILS).
Stopping and starting:
bash docker/stop.sh # Stop all services (your data is preserved)
bash docker/setup.sh # Start again (safe to re-run, uses existing config)Full reset (destructive — deletes all data):
bash docker/reset.sh -v # Stops everything + deletes database, storage, and .env files
bash docker/setup.sh # Fresh start with new secretsNote on re-running
setup.sh: The script is idempotent — it detects existing.envfiles and reuses them. Your Supabase secrets, database passwords, and API keys are not regenerated on subsequent runs. If you need fresh secrets (e.g. something is broken), do a full reset first withreset.sh -v.
If something goes wrong:
# Check container status
docker ps --format "table {{.Names}}\t{{.Status}}"
# Check logs for a specific service
docker logs noobbook-backend
docker logs supabase-db
docker logs supabase-kong
# Nuclear option — wipe everything and start fresh
bash docker/reset.sh -v
bash docker/setup.sh| Command | What it does |
|---|---|
bash docker/setup.sh |
Start everything (idempotent, safe to re-run) |
bash docker/stop.sh |
Stop all services, keep data |
bash docker/reset.sh |
Stop all services, remove network |
bash docker/reset.sh -v |
Stop + delete ALL data (database, storage, .env files) |
| Service | URL |
|---|---|
| NoobBook App | http://localhost |
| Supabase Studio | http://localhost:8000 |
| MinIO Console | http://localhost:9001 |
Note: All API traffic is routed through nginx (
/api/*→ port 80). Direct backend access on port 5001 is still available by default; setBACKEND_PORTindocker/.envto change or restrict it.
Run backend and frontend locally, but you still need Supabase running (via Docker or Supabase Cloud).
Step 1: Start Supabase
# Self-hosted via Docker
cp docker/supabase/.env.example docker/supabase/.env
# Edit docker/supabase/.env (see backend/supabase/SETUP.md for details)
docker network create noobbook-network
docker compose -f docker/supabase/docker-compose.yml --env-file docker/supabase/.env up -d
# Or use Supabase Cloud — get keys from https://app.supabase.com/project/_/settings/apiStep 2: Run database migrations
# Via psql
psql -h localhost -p 5432 -U postgres -d postgres -f backend/supabase/init.sql
# Or via Supabase Studio → SQL Editor → paste contents of init.sql → RunStep 3: Configure environment
cp backend/.env.template backend/.env
nano backend/.envAdd your API keys AND Supabase keys:
# Required API keys
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
PINECONE_API_KEY=...
PINECONE_INDEX_NAME=...
# Required Supabase keys (app won't start without these)
SUPABASE_URL=http://localhost:8000
SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_KEY=your-service-role-keyStep 4: Install and run
macOS / Linux:
bin/setup # First time — creates venv, installs all deps
bin/dev # Starts backend (:5001) + frontend (:5173)
# Options
bin/dev --backend-only # Only Flask server
bin/dev --frontend-only # Only Vite server
bin/dev --install # Update deps before startingWindows:
cd backend
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
cd ..\frontend
npm install
cd ..
python start.py # Starts both servers (run from repo root)
python stop.py # Stops both serversStep 5: Install Playwright (for web scraping)
npx playwright installFor the full Supabase setup guide, see backend/supabase/SETUP.md.
| Layer | Technology |
|---|---|
| Frontend | React + Vite + TypeScript |
| UI | shadcn/ui + Tailwind CSS |
| Icons | Phosphor Icons |
| Backend | Python Flask + SocketIO |
| Database | Supabase (PostgreSQL + S3 Storage + Auth) |
| AI/LLM | Claude (Anthropic), OpenAI Embeddings |
| Vector DB | Pinecone |
| Audio | ElevenLabs |
| Image Gen | Google Gemini |
| Video Gen | Google Veo 2.0 |
Contributions welcome!
Branch strategy:
main- Stable branch for testing and using NoobBookdevelop- Latest changes, all PRs go here
Quick start:
- Fork the repo
- Pull from
develop - Create your branch
- Open a PR to
develop(not main)
See CONTRIBUTING.md for full details and CLAUDE.md for code guidelines.
This project is licensed under the MIT License.
Copyright (c) 2026 Neel Seth / TeacherOp
Built with a $10,000 USD sponsorship grant.
