# Open Notebook

AI research notebook, an open implementation of the NotebookLM idea.

- Replaces: [Google NotebookLM](https://openlogs.fyi/alternatives/google-notebooklm)
- Summary: Paid AI research notebook services, such as Google NotebookLM.
- Stack: TypeScript (language)
- Deployment: docker_compose
- License: MIT (osi) [source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/README.md), read 2026-10-22)
- Difficulty: easy. 2 services, 2 volume mounts, no env values to set, no elevated host access. Heuristic score 2 of 11: easy.
- Requirements: not stated
- Repository: [lfnovo/open-notebook](https://github.com/lfnovo/open-notebook)

## Install

1. Docker with the Compose plugin ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml))

   ```text
   A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
   ```

2. Save the compose file as docker-compose.yml ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml))

   ```yaml
   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
   ```

3. Set the values the compose file needs ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml))

   ```text
   Replace the placeholder values listed under Gotchas.
   ```

4. Start it ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml))

   ```bash
   docker compose up -d
   ```

5. Open the app ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml))

   ```text
   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). ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/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. ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/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). ([source](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 180
- Stars: 40457, forks: 4653
- Last push: 2026-10-20 (1 days ago)
- Latest release: v1.15.0 on 2026-10-04 (17 days ago)

## Sources

- [Repository: https://github.com/lfnovo/open-notebook](https://github.com/lfnovo/open-notebook)
- [License: https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/LICENSE](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/LICENSE)
- [Business model: https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/README.md](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/README.md)
- [Compose file: https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml](https://github.com/lfnovo/open-notebook/blob/a0f6f3081ae06328f0a451b3a3ef2959ca25721d/docker-compose.yml)

---
Canonical: https://openlogs.fyi/tools/open-notebook  
Last updated: 2026-10-22
