| name | open-notebook |
| description | Self-hosted, open-source alternative to Google NotebookLM for AI-powered research and document analysis. Use when organizing research materials into notebooks, ingesting diverse content sources (PDFs, videos, audio, web pages, Office documents), generating AI-powered notes and summaries, creating multi-speaker podcasts from research, chatting with documents using context-aware AI, searching across materials with full-text and vector search, or running custom content transformations. Supports 16+ AI providers including OpenAI, Anthropic, Google, Ollama, Groq, and Mistral with complete data privacy through self-hosting. |
| license | MIT |
| required_environment_variables | [{"name":"OPEN_NOTEBOOK_URL","prompt":"Open Notebook server URL.","required_for":"full functionality"},{"name":"OPEN_NOTEBOOK_PASSWORD","prompt":"Open Notebook password, if auth is enabled.","required_for":"optional features"},{"name":"OPEN_NOTEBOOK_ENCRYPTION_KEY","prompt":"Encryption key for stored content, if configured.","required_for":"optional features"}] |
| metadata | {"version":"1.1","skill-author":"K-Dense Inc.","openclaw":{"envVars":[{"name":"OPEN_NOTEBOOK_URL","required":true,"description":"Open Notebook server URL."},{"name":"OPEN_NOTEBOOK_PASSWORD","required":false,"description":"Open Notebook password, if auth is enabled."},{"name":"OPEN_NOTEBOOK_ENCRYPTION_KEY","required":false,"description":"Encryption key for stored content, if configured."}]}} |
Open Notebook
Overview
Open Notebook is an open-source, self-hosted alternative to Google's NotebookLM that enables researchers to organize materials, generate AI-powered insights, create podcasts, and have context-aware conversations with their documents — all while maintaining complete data privacy.
Unlike Google's Notebook LM, which has no publicly available API outside of the Enterprise version, Open Notebook provides a comprehensive REST API, supports 16+ AI providers, and runs entirely on your own infrastructure.
Key advantages over NotebookLM:
- Full REST API for programmatic access and automation
- Choice of 16+ AI providers (not locked to Google models)
- Multi-speaker podcast generation with 1-4 customizable speakers (vs. 2-speaker limit)
- Complete data sovereignty through self-hosting
- Open source and fully extensible (MIT license)
Repository: https://github.com/lfnovo/open-notebook
Quick Start
Prerequisites
- Docker Desktop installed
- API key for at least one AI provider (or local Ollama for free local inference)
Installation
Deploy Open Notebook using Docker Compose:
curl -o docker-compose.yml https://raw.githubusercontent.com/lfnovo/open-notebook/main/docker-compose.yml
export OPEN_NOTEBOOK_ENCRYPTION_KEY="your-secret-key-here"
docker-compose up -d
Access the application:
Configure AI Provider
After startup, configure at least one AI provider:
- Navigate to Settings > API Keys in the UI
- Add credentials for your preferred provider (OpenAI, Anthropic, etc.)
- Test the connection and discover available models
- Register models for use across the platform
Or configure via the REST API:
import requests
BASE_URL = "http://localhost:5055/api"
response = requests.post(f"{BASE_URL}/credentials", json={
"provider": "openai",
"name": "My OpenAI Key",
"api_key": "sk-..."
})
credential = response.json()
response = requests.post(
f"{BASE_URL}/credentials/{credential['id']}/discover"
)
discovered = response.json()
requests.post(
f"{BASE_URL}/credentials/{credential['id']}/register-models",
json={"model_ids": [m["id"] for m in discovered["models"]]}
)
Core Features
Notebooks
Organize research into separate notebooks, each containing sources, notes, and chat sessions.
import requests
BASE_URL = "http://localhost:5055/api"
response = requests.post(f"{BASE_URL}/notebooks", json={
"name": "Cancer Genomics Research",
"description": "Literature review on tumor mutational burden"
})
notebook = response.json()
notebook_id = notebook["id"]
Sources
Ingest diverse content types including PDFs, videos, audio files, web pages, and Office documents. Sources are processed for full-text and vector search.
response = requests.post(f"{BASE_URL}/sources", data={
"url": "https://arxiv.org/abs/2301.00001",
"notebook_id": notebook_id,
"process_async": "true"
})
source = response.json()
with open("paper.pdf", "rb") as f:
response = requests.post(
f"{BASE_URL}/sources",
data={"notebook_id": notebook_id},
files={"file": ("paper.pdf", f, "application/pdf")}
)
Notes
Create and manage notes (human or AI-generated) associated with notebooks.
response = requests.post(f"{BASE_URL}/notes", json={
"title": "Key Findings",
"content": "TMB correlates with immunotherapy response in NSCLC...",
"note_type": "human",
"notebook_id": notebook_id
})
Context-Aware Chat
Chat with your research materials using AI that cites sources.
session = requests.post(f"{BASE_URL}/chat/sessions", json={
"notebook_id": notebook_id,
"title": "TMB Discussion"
}).json()
response = requests.post(f"{BASE_URL}/chat/execute", json={
"session_id": session["id"],
"message": "What are the key biomarkers for immunotherapy response?",
"context": {"include_sources": True, "include_notes": True}
})
Search
Search across all materials using full-text or vector (semantic) search.
results = requests.post(f"{BASE_URL}/search", json={
"query": "tumor mutational burden immunotherapy",
"search_type": "vector",
"limit": 10
}).json()
answer = requests.post(f"{BASE_URL}/search/ask/simple", json={
"query": "How does TMB predict checkpoint inhibitor response?"
}).json()
Podcast Generation
Generate professional multi-speaker podcasts from research materials with 1-4 customizable speakers.
job = requests.post(f"{BASE_URL}/podcasts/generate", json={
"notebook_id": notebook_id,
"episode_profile_id": episode_profile_id,
"speaker_profile_ids": [speaker1_id, speaker2_id]
}).json()
status = requests.get(f"{BASE_URL}/podcasts/jobs/{job['job_id']}").json()
audio = requests.get(
f"{BASE_URL}/podcasts/episodes/{status['episode_id']}/audio"
)
Content Transformations
Apply custom AI-powered transformations to content for summarization, extraction, and analysis.
transform = requests.post(f"{BASE_URL}/transformations", json={
"name": "extract_methods",
"title": "Extract Methods",
"description": "Extract methodology details from papers",
"prompt": "Extract and summarize the methodology section...",
"apply_default": False
}).json()
result = requests.post(f"{BASE_URL}/transformations/execute", json={
"transformation_id": transform["id"],
"input_text": "...",
"model_id": "model_id_here"
}).json()
Supported AI Providers
Open Notebook supports 16+ AI providers through the Esperanto library:
| Provider | LLM | Embedding | Speech-to-Text | Text-to-Speech |
|---|
| OpenAI | Yes | Yes | Yes | Yes |
| Anthropic | Yes | No | No | No |
| Google GenAI | Yes | Yes | No | Yes |
| Vertex AI | Yes | Yes | No | Yes |
| Ollama | Yes | Yes | No | No |
| Groq | Yes | No | Yes | No |
| Mistral | Yes | Yes | No | No |
| Azure OpenAI | Yes | Yes | No | No |
| DeepSeek | Yes | No | No | No |
| xAI | Yes | No | No | No |
| OpenRouter | Yes | No | No | No |
| ElevenLabs | No | No | Yes | Yes |
| Perplexity | Yes | No | No | No |
| Voyage | No | Yes | No | No |
Environment Variables
Key configuration variables for Docker deployment:
| Variable | Description | Default |
|---|
OPEN_NOTEBOOK_ENCRYPTION_KEY | Required. Secret key for encrypting stored credentials | None |
SURREAL_URL | SurrealDB connection URL | ws://surrealdb:8000/rpc |
SURREAL_NAMESPACE | Database namespace | open_notebook |
SURREAL_DATABASE | Database name | open_notebook |
OPEN_NOTEBOOK_PASSWORD | Optional password protection for the UI | None |
API Reference
The REST API is available at http://localhost:5055/api with interactive documentation at /docs.
Core endpoint groups:
/api/notebooks - Notebook CRUD and source association
/api/sources - Source ingestion, processing, and retrieval
/api/notes - Note management
/api/chat/sessions - Chat session management
/api/chat/execute - Chat message execution
/api/search - Full-text and vector search
/api/podcasts - Podcast generation and management
/api/transformations - Content transformation pipelines
/api/models - AI model configuration and discovery
/api/credentials - Provider credential management
For complete API reference with all endpoints and request/response formats, see references/api_reference.md.
Architecture
Open Notebook uses a modern stack:
- Backend: Python with FastAPI
- Database: SurrealDB (document + relational)
- AI Integration: LangChain with the Esperanto multi-provider library
- Frontend: Next.js with React
- Deployment: Docker Compose with persistent volumes
Important Notes
- Open Notebook requires Docker for deployment
- At least one AI provider must be configured for AI features to work
- For free local inference without API costs, use Ollama
- The
OPEN_NOTEBOOK_ENCRYPTION_KEY must be set before first launch and kept consistent across restarts
- All data is stored locally in Docker volumes for complete data sovereignty