From "Works on My Machine" to Works for the Whole Team.

100+ pages. Full deploy configs. 30+ error fixes. Monitoring, CI/CD. Every fix copy-paste ready.

Who This Is For

✓ You — if you've already got Open Notebook running via Docker, but don't trust it for team use yet.
✓ You — if you need monitoring, backups, CI/CD, and multi-user isolation before sharing it with colleagues.
✗ Not you — if you're just exploring for personal use. The free deployment guide is enough. This manual is overkill for tinkering.
✗ Not you — if you want an official supported product. This is community knowledge, not lfnovo documentation.

What's Inside

10 chapters. Free preview: Ch 0-1. Paid manual: Ch 2-8. PDF + Markdown. Every config is copy-paste ready. Every error has an exact fix — not "check your settings," but "run this command."

What This Is Not

  • ✗ Not an official lfnovo/Google product. This is independent community work. No affiliation, no endorsement.
  • ✗ Not a "magic fix" for every setup. Open Notebook works with 18+ AI providers across different OS/GPU combos. We cover the 3 most common stacks (Ubuntu + Ollama, macOS + Cloud API, Debian + Docker). Edge cases may need adaptation.
  • ✗ Not a video course. It's text — PDF + Markdown. Written for developers who prefer Ctrl+F over scrubbing a timeline.

Why Not Just Read the GitHub Issues?

You can. But the relevant information is scattered across 200+ issues, 50+ discussions, and 4 community forums. The Production Manual organizes, verifies, and writes the fix for each one — with exact commands tested on Ubuntu 24.04, Debian 12, and macOS.

It's the difference between:

Free Preview — Read Chapters 0 & 1

No email. No signup. Just open and read. If these chapters don't convince you this manual is worth $19, nothing will.

Chapter 0: Is Open Notebook Right for You? — 7 min read

Open Notebook is an open-source, self-hosted alternative to Google NotebookLM. It ingests documents (PDFs, URLs, YouTube transcripts, audio), indexes them with embeddings, and lets you chat with your content — plus generate multi-speaker AI podcasts. It supports 18+ AI providers instead of just Gemini, has no 50-source limit, and can run entirely offline.

The question isn't whether it's good. The question is whether you should deploy it.

The 2-Minute Test

mkdir open-notebook && cd open-notebook
curl -O https://raw.githubusercontent.com/lfnovo/open-notebook/main/docker-compose.yml
# Change the encryption key to your own secret string
sed -i 's/change-me-to-a-secret-string/a-random-string-you-pick-now/' docker-compose.yml
docker compose up -d

Open http://localhost:8502. On first run, Docker downloads the images (~30 seconds to 2 minutes depending on your connection). Once the interface appears, you've deployed Open Notebook.

The Honest Comparison

DimensionOpen NotebookNotebookLM
Data privacyFull local mode (Ollama). Cloud APIs see query text only.Everything on Google's servers.
Setup time2 min Docker (cloud API). 15-30 min (Ollama). 1-2 hrs (production).0 min. Sign in.
AI providers18+ (OpenAI, Claude, Ollama, Groq, DeepSeek, ElevenLabs...)Gemini only.
Source limitsNo hard cap. Storage + context window only.50 sources per notebook. 500K words per source.
Podcast generation1-4 speakers. Custom voice profiles. Editable prompts.2 speakers. "Live host" mode.
API accessFull REST API on port 5055.None.
CitationsBasic (acknowledged weakness).Excellent. Exact passages highlighted.
Cost$0-$30/user/month (API) or $0 (Ollama) + infra.Free tier. Plus: ~$20/month/user.
OfflineYes, with Ollama.No.

vs AnythingLLM

AnythingLLM (also open source) is similar — but Open Notebook's podcast/audio overview feature is the differentiator. If you don't need podcast generation, AnythingLLM has a more polished UI and easier setup. If you do need podcasts, Open Notebook is the clear winner.

vs PrivateGPT

PrivateGPT focuses on document Q&A with guaranteed local processing. It's lighter but has no podcast feature, no multi-model routing, and a more basic UI. Open Notebook is the full research workspace; PrivateGPT is the focused document chatbot.

Who Should Self-Host

Do it if:

  • You handle sensitive documents (legal, medical, proprietary code) and can't upload them to Google
  • You want API access to automate document processing in your workflow
  • You've hit NotebookLM's 50-source cap and still have 100 more papers to ingest
  • You need podcasts with more than 2 speakers or custom voice profiles
  • You want to use Claude or GPT-4o for analysis quality that Gemini can't match
  • You're building a product and need a white-label document AI backend

Skip it if:

  • You use NotebookLM casually and have no compliance requirements
  • You don't want to spend 1-2 hours on initial setup and ongoing maintenance
  • You need production-quality citations (Open Notebook's citations are basic)
  • You just need a chatbot for a few PDFs (use ChatGPT file upload or Claude Projects)

The $0 vs $30 vs $150 Setup

$0/month$30/month$150/month
Chat modelOllama (gpt-oss:20b)Groq (llama-3.3-70b)Claude Sonnet
EmbeddingOllama (nomic-embed-text)OpenAI (text-embedding-3-small)Same
Podcast TTSOffline (no podcasts)ElevenLabsElevenLabs
Good forSolo privacy useSolo/2-person, good qualityFull team, best quality
GPU neededYes (12GB+ VRAM)NoNo

Note: Groq offers a generous free tier — most solo users won't hit $30/month under normal usage. The $30 figure is a conservative ceiling.

Chapter 1: Docker Deep Dive — From docker compose up to a Solid Foundation — 15 min read

Chapter 0 gave you a 2-minute quickstart. This chapter explains every single line you just ran, so when something breaks at 2 AM, you know exactly where to look.

The Full docker-compose.yml — Line by Line

Here's the actual compose file from lfnovo/open-notebook, annotated:

services:
  # ── SERVICE 1: SurrealDB (Database) ──
  surrealdb:
    image: surrealdb/surrealdb:v2
    command: start --log info \
      --user ${SURREAL_USER:-root} \
      --pass ${SURREAL_PASSWORD:-root} \
      rocksdb:/mydata/mydatabase.db
    user: root  # Required for bind mounts on Linux
    ports:
      - "8000:8000"
    volumes:
      - ./surreal_data:/mydata     # All notebooks, notes, chat history
    environment:
      - SURREAL_EXPERIMENTAL_GRAPHQL=true
    restart: always
    pull_policy: always

  # ── SERVICE 2: Open Notebook App ──
  open_notebook:
    image: lfnovo/open_notebook:v1-latest
    ports:
      - "8502:8502"  # Web UI
      - "5055:5055"  # REST API
    volumes:
      - ./notebook_data:/app/data   # Uploaded files, processed docs
    environment:
      # REQUIRED: Change this to your own secret string
      - OPEN_NOTEBOOK_ENCRYPTION_KEY=change-me-to-a-secret-string
      # Database connection
      - SURREAL_URL=ws://surrealdb:8000/rpc
      - SURREAL_USER=${SURREAL_USER:-root}
      - SURREAL_PASSWORD=${SURREAL_PASSWORD:-root}
      - SURREAL_NAMESPACE=open_notebook
      - SURREAL_DATABASE=open_notebook
    depends_on:
      - surrealdb
    restart: always
    pull_policy: always
  • No version: key — Docker Compose V2 doesn't need it.
  • DB service starts first (depends_on), but the app retries internally on startup.
  • user: root on SurrealDB is intentional — Linux bind mounts default to root ownership.
  • No AI provider keys here. Configure them via the UI at Settings → API Keys. The old env-var approach is deprecated.

What Each Volume Actually Stores

PathContentsBackup Priority
./surreal_data/Every notebook, note, chat message, source metadataCRITICAL
./notebook_data/Raw uploaded files (PDFs, audio), processed chunksHIGH

You can delete ./notebook_data/ and re-upload documents without losing your research structure. You absolutely cannot delete ./surreal_data/.

The Networking Model

Inside Docker's default bridge network, services reach each other by container name:

open_notebook → surrealdb    via ws://surrealdb:8000/rpc    ← Docker DNS
open_notebook → ollama       via http://ollama:11434         ← Docker DNS
your browser  → open_notebook via http://localhost:8502      ← Host port mapping
This is the #1 source of first-time errors. When adding Ollama in the Settings UI, use http://ollama:11434 — not http://localhost:11434. Inside the container, localhost points to the container itself.

Adding Ollama to the Stack

  ollama:
    image: ollama/ollama:latest
    container_name: open-notebook-ollama
    ports:
      - "11434:11434"
    volumes:
      - ./ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: always
    pull_policy: always

If you're on CPU-only or Apple Silicon, remove the entire deploy.resources block.

The First-Run Checklist

# 1. All services running?
docker compose ps

# 2. Web UI accessible?
curl -I http://localhost:8502

# 3. API responding?
curl http://localhost:5055/api/health

# 4. Database connected?
docker compose logs surrealdb | grep -i "started"

# 5. Ollama model loaded (if using Ollama)?
curl http://localhost:11434/api/tags

# 6. ENCRYPTION_KEY changed from default?
docker compose exec open_notebook env | grep ENCRYPTION_KEY

# 7. Disk space adequate?
df -h ./surreal_data ./notebook_data ./ollama_data

Five Common First-Run Errors (And Their Exact Fixes)

Error 1: Ports are not available

sudo lsof -i :8502
# Change host port: "8503:8502" → access on :8503

Error 2: PermissionError on SurrealDB

The SurrealDB container runs as root by default (user: root in compose), which is correct for Linux bind mounts. If you've changed this:

sudo chown -R 1000:1000 ./surreal_data

Error 3: Ollama embedding — Connection error, but chat works

This is the Esperanto library bug (Issue #655). In Settings → API Keys → Ollama, verify the Base URL is set correctly. If the embedding-specific URL field is available, set it explicitly. Workaround: use a cloud embedding provider (OpenAI text-embedding-3-small or Voyage AI) at < $0.01 per 1000 documents.

Error 4: CUDA out of memory

GPU VRAMModel sizeRecommended num_ctx
12 GB20B2048
24 GB20B8192
12 GB8B8192 (recommended)
8 GB8B4096

Error 5: WebSocket connection to SurrealDB failed

docker compose exec open_notebook sh -c "wget -qO- http://surrealdb:8000/health"
docker compose ps  # Verify both services are Up

SurrealDB: Quick Backup/Restore

# Backup
docker compose exec surrealdb surreal export \
  --conn http://localhost:8000 --user root --pass root \
  --ns open_notebook --db open_notebook \
  > backup-$(date +%Y%m%d).surql

# Restore
cat backup-20260625.surql | docker compose exec -T surrealdb surreal import \
  --conn http://localhost:8000 --user root --pass root \
  --ns open_notebook --db open_notebook

This is the quality bar for every chapter in the full manual. Copy-paste ready. No filler. Real error messages with exact fixes.

Get the Production Manual

$19 one-time

PDF + Markdown. Instant download. Free updates.

30-day money-back guarantee. If it doesn't save you 20+ hours, email support@localnotebook.dev for a full refund.

Before you buy: This manual assumes you can already run docker compose up and read a terminal. It doesn't teach Docker basics or explain what a GPU is. The Error Reference chapter covers 30+ issues we've personally hit — but Open Notebook is evolving fast. New errors will appear. You'll still need to read error messages and think critically. What this manual gives you is a head start of 20+ hours and a known-good production baseline.
Free updates for life. Open Notebook releases new versions ~monthly. The manual updates with it — you get every revision at no extra cost.

FAQ

Is this official? Does lfnovo endorse it?

No. This is an independent community resource. Not affiliated with or endorsed by lfnovo or Google. It's built from real-world deployment experience — running Open Notebook in production for document research.

What if it doesn't help me?

Email support@localnotebook.dev within 30 days for a full refund. No questions asked. We mean it — if the manual doesn't save you 20+ hours, you shouldn't pay for it.

Will this stay updated with new Open Notebook versions?

Yes. You get all future updates at no extra cost. When Open Notebook ships a breaking change or new feature, the manual is updated within 2 weeks.

I just need the free guides. Is this necessary?

For personal use with cloud APIs, the free deployment guide is enough. If you're deploying for a team, running local models, or need it to work reliably day after day — that's when the 30+ error fixes, monitoring setup, and CI/CD templates pay for themselves.