OpenLogs

All tools

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

lfnovo/open-notebook

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

Config check passed docker compose config exited 0 on this exact file on 2026-10-22.
docker-compose.yml Version 1
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

  1. 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.

  2. Save the compose file as docker-compose.yml (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)

    Use the compose file shown above.

  3. Set the values the compose file needs (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)

    Replace the placeholder values listed under Gotchas.

  4. Start it (github.com/lfnovo/open-notebook/blob/a0f6f30/docker-compose.yml)
    docker compose up -d
  5. 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

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)