Open Notebook
AI research notebook, an open implementation of the NotebookLM idea.
- Replaces
-
Paid AI research notebook services, such as Google NotebookLM.
All open-source alternatives to Google NotebookLM
- Difficulty
-
Difficulty: Easy
2 services, 2 volume mounts, no env values to set, no elevated host access. Heuristic score 2 of 11: easy.
- Stack
TypeScript (language)
- Deployment
docker_compose
- Requirements
Not stated.
- License
-
MIT(OSI-approved open source)Read from github.com/lfnovo/open-notebook/blob/a0f6f30/LICENSE
- Business model
-
Unknown
The README at the pinned commit does not state a business model, so it stays unknown.
Source: github.com/lfnovo/open-notebook/blob/a0f6f30/README.md, read on .
- Repository
GitHub stats
- Stars
- 40,457
- Forks
- 4,653
- Open issues and pull requests
- 180
- Last push
- 2026-10-20
- Latest release
- v1.15.0
- Released
- 2026-10-04
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as MIT.
Compose file
services:
surrealdb:
image: surrealdb/surrealdb:v2
# Credentials default to root:root for a zero-config local setup. Before
# exposing this instance to a network, set SURREAL_USER / SURREAL_PASSWORD
# in a .env file (see .env.example) — they are applied here and to the
# open_notebook service below, so the two always stay in sync.
# List (exec) form so each interpolated value stays a single argument —
# a password containing spaces would otherwise be split into several.
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:
# Bound to localhost only: the open_notebook service reaches this over
# the internal compose network regardless, so the host port is purely
# for local debugging (e.g. Surrealist, `surreal sql`). Exposing this
# on 0.0.0.0 would let anyone who can reach the host connect with the
# default root:root credentials.
- "127.0.0.1:8000:8000"
volumes:
- ./surreal_data:/mydata
environment:
- SURREAL_EXPERIMENTAL_GRAPHQL=true
restart: always
pull_policy: always
open_notebook:
image: lfnovo/open_notebook:v1-latest
ports:
- "8502:8502" # Web UI
- "5055:5055" # REST API
environment:
# REQUIRED: Change this to your own secret string
# This encrypts your API keys in the database
- OPEN_NOTEBOOK_ENCRYPTION_KEY=change-me-to-a-secret-string
# Database connection. SURREAL_USER / SURREAL_PASSWORD default to root:root
# for local use; override them in a .env file before exposing the instance
# (the same values configure the surrealdb service above).
- SURREAL_URL=ws://surrealdb:8000/rpc
- SURREAL_USER=${SURREAL_USER:-root}
- SURREAL_PASSWORD=${SURREAL_PASSWORD:-root}
- SURREAL_NAMESPACE=open_notebook
- SURREAL_DATABASE=open_notebook
# OPTIONAL: heavy extraction runtimes, installed on first startup when
# enabled (downloads are cached on the ./notebook_data volume, so only the
# first boot is slow). See docs/5-CONFIGURATION/environment-reference.md.
# - OPEN_NOTEBOOK_ENABLE_DOCLING=true # Docling engine + OCR + image sources (large ML stack)
# - OPEN_NOTEBOOK_ENABLE_CRAWL4AI=true # local Crawl4AI (bundles a Chromium browser)
# - CRAWL4AI_API_URL=http://crawl4ai:11235 # use a remote Crawl4AI server instead (no local install)
# - CRAWL4AI_API_TOKEN=${CRAWL4AI_API_TOKEN} # bearer token for that server (required by Crawl4AI >= 0.9.0)
# OPTIONAL: max concurrent background tasks the worker processes at once
# (default 5). Set to 1 for sequential processing on single-GPU / local
# LLM setups to avoid overloading the model with parallel requests.
# - OPEN_NOTEBOOK_WORKER_MAX_TASKS=1
volumes:
- ./notebook_data:/app/data
depends_on:
- surrealdb
restart: always
pull_policy: always
From the app's own repository: github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml.
Compose file from the app repository.
Install
- Docker with the Compose plugin (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)
A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
- Save the compose file as docker-compose.yml (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)
Use the compose file shown above.
- Set the values the compose file needs (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)
Replace the placeholder values listed under Gotchas.
- Start it (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)
docker compose up -d - Open the app (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)
Open http://localhost:8502. The compose file publishes host port 8502 for the open_notebook service.
Compose file check: config_ok on 2026-10-22.
Gotchas and maintenance
Gotchas
- The compose file has placeholder values. Placeholder values: OPEN_NOTEBOOK_ENCRYPTION_KEY is "change-me-to-a-secret-string" (open_notebook). (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml, checked 2026-10-22)
- The compose file publishes host ports. Host ports: 127.0.0.1:8000 (surrealdb), 8502 (open_notebook), 5055 (open_notebook). A port without a host address listens on all host network interfaces. (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml, checked 2026-10-22)
- The compose file mounts host folders. Host paths mounted into containers: ./surreal_data at /mydata (surrealdb), ./notebook_data at /app/data (open_notebook). (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml, checked 2026-10-22)
Signals
- Open issues and pull requests: 180
- Last push: 2026-10-20 (1 days before this page was built)
- Latest release: v1.15.0 on 2026-10-04 (17 days before this page was built)