# Repository: lfnovo/open-notebook # Stars: 22310 ## CLAUDE.md # Open Notebook - Root CLAUDE.md This file provides architectural guidance for contributors working on Open Notebook at the project level. ## Project Overview **Open Notebook** is an open-source, privacy-focused alternative to Google's Notebook LM. It's an AI-powered research assistant enabling users to upload multi-modal content (PDFs, audio, video, web pages), generate intelligent notes, search semantically, chat with AI models, and produce professional podcasts—all with complete control over data and choice of AI providers. **Key Values**: Privacy-first, multi-provider AI support, fully self-hosted option, open-source transparency. --- ## Three-Tier Architecture ``` ┌─────────────────────────────────────────────────────────┐ │ Frontend (React/Next.js) │ │ frontend/ @ port 3000 │ ├─────────────────────────────────────────────────────────┤ │ - Notebooks, sources, notes, chat, podcasts, search UI │ │ - Zustand state management, TanStack Query (React Query)│ │ - Shadcn/ui component library with Tailwind CSS │ └────────────────────────┬────────────────────────────────┘ │ HTTP REST ┌────────────────────────▼────────────────────────────────┐ │ API (FastAPI) │ │ api/ @ port 5055 │ ├─────────────────────────────────────────────────────────┤ │ - REST endpoints for notebooks, sources, notes, chat │ │ - LangGraph workflow orchestration │ │ - Job queue for async operations (podcasts) │ │ - Multi-provider AI provisioning via Esperanto │ └────────────────────────┬────────────────────────────────┘ │ SurrealQL ┌────────────────────────▼────────────────────────────────┐ │ Database (SurrealDB) │ │ Graph database @ port 8000 │ ├─────────────────────────────────────────────────────────┤ │ - Records: Notebook, Source, Note, ChatSession, Credential│ │ - Relationships: source-to-notebook, note-to-source │ │ - Vector embeddings for semantic search │ └─────────────────────────────────────────────────────────┘ ``` --- ## Useful sources User documentation is at @docs/ ## Tech Stack ### Frontend (`frontend/`) - **Framework**: Next.js 16 (React 19) - **Language**: TypeScript - **State Management**: Zustand - **Data Fetching**: TanStack Query (React Query) - **Styling**: Tailwind CSS + Shadcn/ui - **Build Tool**: Webpack (via Next.js) - **i18n compatible**: All front-end changes must also consider the translation keys ### API Backend (`api/` + `open_notebook/`) - **Framework**: FastAPI 0.104+ - **Language**: Python 3.11+ - **Workflows**: LangGraph state machines - **Database**: SurrealDB async driver - **AI Providers**: Esperanto library (8+ providers: OpenAI, Anthropic, Google, Groq, Ollama, Mistral, DeepSeek, xAI) - **Job Queue**: Surreal-Commands for async jobs (podcasts) - **Logging**: Loguru - **Validation**: Pydantic v2 - **Testing**: Pytest ### Database - **SurrealDB**: Graph database with built-in embedding storage and vector search - **Schema Migrations**: Automatic on API startup via AsyncMigrationManager ### Additional Services - **Content Processing**: content-core library (file/URL extraction) - **Prompts**: AI-Prompter with Jinja2 templating - **Podcast Generation**: podcast-creator library - **Embeddings**: Multi-provider via Esperanto --- ## Architecture Highlights ### 1. Async-First Design - All database queries, graph invocations, and API calls are async (await) - SurrealDB async driver with connection pooling - FastAPI handles concurrent requests efficiently ### 2. LangGraph Workflows - **source.py**: Content ingestion (extract → embed → save) - **chat.py**: Conversational agent with message history - **ask.py**: Search + synthesis (retrieve relevant sources → LLM) - **transformation.py**: Custom transformations on sources - All use `provision_langchain_model()` for smart model selection ### 3. Multi-Provider AI - **Esperanto library**: Unified interface to 8+ AI providers - **Credential system**: Individual encrypted credential records per provider; models link to credentials for direct config - **ModelManager**: Factory pattern with fallback logic; uses credential config when available, env vars as fallback - **Smart selection**: Detects large contexts, prefers long-context models - **Override support**: Per-request model configuration ### 4. Database Schema - **Automatic migrations**: AsyncMigrationManager runs on API startup - **SurrealDB graph model**: Records with relationships and embeddings - **Vector search**: Built-in semantic search across all content - **Transactions**: Repo functions handle ACID operations ### 5. Authentication - **Current**: Simple password middleware (insecure, dev-only) - **Production**: Replace with OAuth/JWT (see CONFIGURATION.md) --- ## Important Quirks & Gotchas ### API Startup - **Migrations run automatically** on startup; check logs for errors - **Must start API before UI**: UI depends on API for all data - **SurrealDB must be running**: API fails without database connection ### Frontend-Backend Communication - **Base API URL**: Configured in `.env.local` (default: http://localhost:5055) - **CORS enabled**: Configured in `api/main.py` (allow all origins in dev) - **Rate limiting**: Not built-in; add at proxy layer for production ### LangGraph Workflows - **Blocking operations**: Chat/podcast workflows may take minutes; no timeout - **State persistence**: Uses SQLite checkpoint storage in `/data/sqlite-db/` - **Model fallback**: If primary model fails, falls back to cheaper/smaller model ### Podcast Generation - **Async job queue**: `podcast_service.py` submits jobs but doesn't wait - **Track status**: Use `/commands/{command_id}` endpoint to poll status - **TTS failures**: Fall back to silent audio if speech synthesis fails ### Content Processing - **File extraction**: Uses content-core library; supports 50+ file types - **URL handling**: Extracts text + metadata from web pages - **Large files**: Content processing is sync; may block API briefly --- ## Component References See dedicated CLAUDE.md files for detailed guidance: - **[frontend/CLAUDE.md](frontend/CLAUDE.md)**: React/Next.js architecture, state management, API integration - **[api/CLAUDE.md](api/CLAUDE.md)**: FastAPI structure, service pattern, endpoint development - **[open_notebook/CLAUDE.md](open_notebook/CLAUDE.md)**: Backend core, domain models, LangGraph workflows, AI provisioning - **[open_notebook/domain/CLAUDE.md](open_notebook/domain/CLAUDE.md)**: Data models, repository pattern, search functions - **[open_notebook/ai/CLAUDE.md](open_notebook/ai/CLAUDE.md)**: ModelManager, AI provider integration, Esperanto usage - **[open_notebook/graphs/CLAUDE.md](open_notebook/graphs/CLAUDE.md)**: LangGraph workflow design, state machines - **[open_notebook/database/CLAUDE.md](open_notebook/database/CLAUDE.md)**: SurrealDB operations, migrations, async patterns --- ## Documentation Map - **[README.md](README.md)**: Project overview, features, quick start - **[docs/index.md](docs/index.md)**: Complete user & deployment documentation - **[CONFIGURATION.md](CONFIGURATION.md)**: Environment variables, model configuration - **[CONTRIBUTING.md](CONTRIBUTING.md)**: Contribution guidelines - **[MAINTAINER_GUIDE.md](MAINTAINER_GUIDE.md)**: Release & maintenance procedures --- ## Testing Strategy - **Unit tests**: `tests/test_domain.py`, `test_models_api.py` - **Graph tests**: `tests/test_graphs.py` (workflow integration) - **Utils tests**: `tests/test_utils.py`, `tests/test_chunking.py`, `tests/test_embedding.py` - **Run all**: `uv run pytest tests/` - **Coverage**: Check with `pytest --cov` --- ## Common Tasks ### Add a New API Endpoint 1. Create router in `api/routers/feature.py` 2. Create service in `api/feature_service.py` 3. Define schemas in `api/models.py` 4. Register router in `api/main.py` 5. Test via http://localhost:5055/docs ### Add a New LangGraph Workflow 1. Create `open_notebook/graphs/workflow_name.py` 2. Define StateDict and node functions 3. Build graph with `.add_node()` / `.add_edge()` 4. Invoke in service: `graph.ainvoke({"input": ...}, config={"..."})` 5. Test with sample data in `tests/` ### Add Database Migration 1. Create `migrations/XXX_description.surql` 2. Write SurrealQL schema changes 3. Create `migrations/XXX_description_down.surql` (optional rollback) 4. API auto-detects on startup; migration runs if newer than recorded version ### Deploy to Production 1. Review [CONFIGURATION.md](CONFIGURATION.md) for security settings 2. Use `make docker-release` for multi-platform image 3. Push to Docker Hub / GitHub Container Registry 4. Deploy `docker compose --profile multi up` 5. Verify migrations via API logs --- ## Support & Community - **Documentation**: https://open-notebook.ai - **Discord**: https://discord.gg/37XJPXfz2w - **Issues**: https://github.com/lfnovo/open-notebook/issues - **License**: MIT (see LICENSE) ## README.md [![Forks][forks-shield]][forks-url] [![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url] [![MIT License][license-shield]][license-url]
Logo

Open Notebook

An open source, privacy-focused alternative to Google's Notebook LM!
Join our Discord server for help, to share workflow ideas, and suggest features!
Checkout our website »

📚 Get Started · 📖 User Guide · ✨ Features · 🚀 Deploy

lfnovo%2Fopen-notebook | Trendshift

Deutsch | Español | français | 日本語 | 한국어 | Português | Русский | 中文
## A private, multi-model, 100% local, full-featured alternative to Notebook LM ![New Notebook](docs/assets/asset_list.png) In a world dominated by Artificial Intelligence, having the ability to think 🧠 and acquire new knowledge 💡, is a skill that should not be a privilege for a few, nor restricted to a single provider. **Open Notebook empowers you to:** - 🔒 **Control your data** - Keep your research private and secure - 🤖 **Choose your AI models** - Support for 18+ providers including OpenAI, Anthropic, Ollama, LM Studio, and more - 📚 **Organize multi-modal content** - PDFs, videos, audio, web pages, and more - 🎙️ **Generate professional podcasts** - Advanced multi-speaker podcast generation - 🔍 **Search intelligently** - Full-text and vector search across all your content - 💬 **Chat with context** - AI conversations powered by your research - 🌐 **Multi-language UI** - English, Portuguese, Chinese (Simplified & Traditional), Japanese, Russian, and Bengali support Learn more about our project at [https://www.open-notebook.ai](https://www.open-notebook.ai) --- ## 🆚 Open Notebook vs Google Notebook LM | Feature | Open Notebook | Google Notebook LM | Advantage | |---------|---------------|--------------------|-----------| | **Privacy & Control** | Self-hosted, your data | Google cloud only | Complete data sovereignty | | **AI Provider Choice** | 18+ providers (OpenAI, Anthropic, Ollama, LM Studio, etc.) | Google models only | Flexibility and cost optimization | | **Podcast Speakers** | 1-4 speakers with custom profiles | 2 speakers only | Extreme flexibility | | **Content Transformations** | Custom and built-in | Limited options | Unlimited processing power | | **API Access** | Full REST API | No API | Complete automation | | **Deployment** | Docker, cloud, or local | Google hosted only | Deploy anywhere | | **Citations** | Basic references (will improve) | Comprehensive with sources | Research integrity | | **Customization** | Open source, fully customizable | Closed system | Unlimited extensibility | | **Cost** | Pay only for AI usage | Free tier + Monthly subscription | Transparent and controllable | **Why Choose Open Notebook?** - 🔒 **Privacy First**: Your sensitive research stays completely private - 💰 **Cost Control**: Choose cheaper AI providers or run locally with Ollama - 🎙️ **Better Podcasts**: Full script control and multi-speaker flexibility vs limited 2-speaker deep-dive format - 🔧 **Unlimited Customization**: Modify, extend, and integrate as needed - 🌐 **No Vendor Lock-in**: Switch providers, deploy anywhere, own your data ### Built With [![Python][Python]][Python-url] [![Next.js][Next.js]][Next-url] [![React][React]][React-url] [![SurrealDB][SurrealDB]][SurrealDB-url] [![LangChain][LangChain]][LangChain-url] ## 🚀 Quick Start (2 Minutes) ### Prerequisites - [Docker Desktop](https://www.docker.com/products/docker-desktop/) installed - That's it! (API keys configured later in the UI) ### Step 1: Get docker-compose.yml **Option A:** Download directly ```bash curl -o docker-compose.yml https://raw.githubusercontent.com/lfnovo/open-notebook/main/docker-compose.yml ``` **Option B:** Create the file manually Copy this into a new file called `docker-compose.yml`: ```yaml services: surrealdb: image: surrealdb/surrealdb:v2 command: start --log info --user root --pass root rocksdb:/mydata/mydatabase.db user: root ports: - "8000:8000" volumes: - ./surreal_data:/mydata restart: always open_notebook: image: lfnovo/open_notebook:v1-latest ports: - "8502:8502" - "5055:5055" environment: - OPEN_NOTEBOOK_ENCRYPTION_KEY=change-me-to-a-secret-string - SURREAL_URL=ws://surrealdb:8000/rpc - SURREAL_USER=root - SURREAL_PASSWORD=root - SURREAL_NAMESPACE=open_notebook - SURREAL_DATABASE=open_notebook volumes: - ./notebook_data:/app/data depends_on: - surrealdb restart: always ``` ### Step 2: Set Your Encryption Key Edit `docker-compose.yml` and change this line: ```yaml - OPEN_NOTEBOOK_ENCRYPTION_KEY=change-me-to-a-secret-string ``` to any secret value (e.g., `my-super-secret-key-123`) ### Step 3: Start Services ```bash docker compose up -d ``` Wait 15-20 seconds, then open: **http://localhost:8502** ### Step 4: Configure AI Provider 1. Go to **Settings** → **API Keys** 2. Click **Add Credential** 3. Choose your provider (OpenAI, Anthropic, Google, etc.) 4. Paste your API key and click **Save** 5. Click **Test Connection** → **Discover Models** → **Register Models** Done! You're ready to create your first notebook. > **Need an API key?** Get one from: > [OpenAI](https://platform.openai.com/api-keys) · [Anthropic](https://console.anthropic.com/) · [Google](https://aistudio.google.com/) · [Groq](https://console.groq.com/) (free tier) > **Want free local AI?** See [examples/docker-compose-ollama.yml](examples/) for Ollama setup --- ### 📚 More Installation Options - **[With Ollama (Free Local AI)](examples/docker-compose-ollama.yml)** - Run models locally without API costs - **[From Source (Developers)](docs/1-INSTALLATION/from-source.md)** - For development and contributions - **[Complete Installation Guide](docs/1-INSTALLATION/index.md)** - All deployment scenarios --- ### 📖 Need Help? - **🤖 AI Installation Assistant**: [CustomGPT to help you install](https://chatgpt.com/g/g-68776e2765b48191bd1bae3f30212631-open-notebook-installation-assistant) - **🆘 Troubleshooting**: [5-minute troubleshooting guide](docs/6-TROUBLESHOOTING/quick-fixes.md) - **💬 Community Support**: [Discord Server](https://discord.gg/37XJPXfz2w) - **🐛 Report Issues**: [GitHub Issues](https://github.com/lfnovo/open-notebook/issues) --- ## Star History [![Star History Chart](https://api.star-history.com/svg?repos=lfnovo/open-notebook&type=date&legend=top-left)](https://www.star-history.com/#lfnovo/open-notebook&type=date&legend=top-left) ## Provider Support Matrix Thanks to the [Esperanto](https://github.com/lfnovo/esperanto) library, we support this providers out of the box! | Provider | LLM Support | Embedding Support | Speech-to-Text | Text-to-Speech | |--------------|-------------|------------------|----------------|----------------| | OpenAI | ✅ | ✅ | ✅ | ✅ | | Anthropic | ✅ | ❌ | ❌ | ❌ | | Groq | ✅ | ❌ | ✅ | ❌ | | Google (GenAI) | ✅ | ✅ | ❌ | ✅ | | Vertex AI | ✅ | ✅ | ❌ | ✅ | | Ollama | ✅ | ✅ | ❌ | ❌ | | Perplexity | ✅ | ❌ | ❌ | ❌ | | ElevenLabs | ❌ | ❌ | ✅ | ✅ | | Azure OpenAI | ✅ | ✅ | ❌ | ❌ | | Mistral | ✅ | ✅ | ❌ | ❌ | | DeepSeek | ✅ | ❌ | ❌ | ❌ | | Voyage | ❌ | ✅ | ❌ | ❌ | | xAI | ✅ | ❌ | ❌ | ❌ | | OpenRouter | ✅ | ❌ | ❌ | ❌ | | DashScope (Qwen) | ✅ | ❌ | ❌ | ❌ | | MiniMax | ✅ | ❌ | ❌ | ❌ | | OpenAI Compatible* | ✅ | ❌ | ❌ | ❌ | *Supports LM Studio and any OpenAI-compatible endpoint ## ✨ Key Features ### Core Capabilities - **🔒 Privacy-First**: Your data stays under your control - no cloud dependencies - **🎯 Multi-Notebook Organization**: Manage multiple research projects seamlessly - **📚 Universal Content Support**: PDFs, videos, audio, web pages, Office docs, and more - **🤖 Multi-Model AI Support**: 18+ providers including OpenAI, Anthropic, Ollama, Google, LM Studio, and more - **🎙️ Professional Podcast Generation**: Advanced multi-speaker podcasts with Episode Profiles - **🔍 Intelligent Search**: Full-text and vector search across all your content - **💬 Context-Aware Chat**: AI conversations powered by your research materials - **📝 AI-Assisted Notes**: Generate insights or write notes manually ### Advanced Features - **⚡ Reasoning Model Support**: Full support for thinking models like DeepSeek-R1 and Qwen3 - **🔧 Content Transformations**: Powerful customizable actions to summarize and extract insights - **🌐 Comprehensive REST API**: Full programmatic access for custom integrations [![API Docs](https://img.shields.io/badge/API-Documentation-blue?style=flat-square)](http://localhost:5055/docs) - **🔐 Optional Password Protection**: Secure public deployments with authentication - **📊 Fine-Grained Context Control**: Choose exactly what to share with AI models - **📎 Citations**: Get answers with proper source citations ## Podcast Feature [![Check out our podcast sample](https://img.youtube.com/vi/D-760MlGwaI/0.jpg)](https://www.youtube.com/watch?v=D-760MlGwaI) ## 📚 Documentation ### Getting Started - **[📖 Introduction](docs/0-START-HERE/index.md)** - Learn what Open Notebook offers - **[⚡ Quick Start](docs/0-START-HERE/quick-start.md)** - Get up and running in 5 minutes - **[🔧 Installation](docs/1-INSTALLATION/index.md)** - Comprehensive setup guide - **[🎯 Your First Notebook](docs/0-START-HERE/first-notebook.md)** - Step-by-step tutorial ### User Guide - **[📱 Interface Overview](docs/3-USER-GUIDE/interface-overview.md)** - Understanding the layout - **[📚 Notebooks](docs/3-USER-GUIDE/notebooks.md)** - Organizing your research - **[📄 Sources](docs/3-USER-GUIDE/sources.md)** - Managing content types - **[📝 Notes](docs/3-USER-GUIDE/notes.md)** - Creating and managing notes - **[💬 Chat](docs/3-USER-GUIDE/chat.md)** - AI conversations - **[🔍 Search](docs/3-USER-GUIDE/search.md)** - Finding information ### Advanced Topics - **[🎙️ Podcast Generation](docs/2-CORE-CONCEPTS/podcasts.md)** - Create professional podcasts - **[🔧 Content Transformations](docs/2-CORE-CONCEPTS/transformations.md)** - Customize content processing - **[🤖 AI Models](docs/4-AI-PROVIDERS/index.md)** - AI model configuration - **[🔌 MCP Integration](docs/5-CONFIGURATION/mcp-integration.md)** - Connect with Claude Desktop, VS Code and other MCP clients - **[🔧 REST API Reference](docs/7-DEVELOPMENT/api-reference.md)** - Complete API documentation - **[🔐 Security](docs/5-CONFIGURATION/security.md)** - Password protection and privacy - **[🚀 Deployment](docs/1-INSTALLATION/index.md)** - Complete deployment guides for all scenarios

(back to top)

## 🗺️ Roadmap ### Upcoming Features - **Live Front-End Updates**: Real-time UI updates for smoother experience - **Async Processing**: Faster UI through asynchronous content processing - **Cross-Notebook Sources**: Reuse research materials across projects - **Bookmark Integration**: Connect with your favorite bookmarking apps ### Recently Completed ✅ - **Next.js Frontend**: Modern React-based frontend with improved performance - **Comprehensive REST API**: Full programmatic access to all functionality - **Multi-Model Support**: 18+ AI providers including OpenAI, Anthropic, Ollama, LM Studio - **Advanced Podcast Generator**: Professional multi-speaker podcasts with Episode Profiles - **Content Transformations**: Powerful customizable actions for content processing - **Enhanced Citations**: Improved layout and finer control for source citations - **Multiple Chat Sessions**: Manage different conversations within notebooks See the [open issues](https://github.com/lfnovo/open-notebook/issues) for a full list of proposed features and known issues.

(back to top)

## 📖 Need Help? - **🤖 AI Installation Assistant**: We have a [CustomGPT built to help you install Open Notebook](https://chatgpt.com/g/g-68776e2765b48191bd1bae3f30212631-open-notebook-installation-assistant) - it will guide you through each step! - **New to Open Notebook?** Start with our [Getting Started Guide](docs/0-START-HERE/index.md) - **Need installation help?** Check our [Installation Guide](docs/1-INSTALLATION/index.md) - **Want to see it in action?** Try our [Quick Start Tutorial](docs/0-START-HERE/quick-start.md) ## 🤝 Community & Contributing ### Join the Community - 💬 **[Discord Server](https://discord.gg/37XJPXfz2w)** - Get help, share ideas, and connect with other users - 🐛 **[GitHub Issues](https://github.com/lfnovo/open-notebook/issues)** - Report bugs and request features - ⭐ **Star this repo** - Show your support and help others discover Open Notebook ### Contributing We welcome contributions! We're especially looking for help with: - **Frontend Development**: Help improve our modern Next.js/React UI - **Testing & Bug Fixes**: Make Open Notebook more robust - **Feature Development**: Build the coolest research tool together - **Documentation**: Improve guides and tutorials **Current Tech Stack**: Python, FastAPI, Next.js, React, SurrealDB **Future Roadmap**: Real-time updates, enhanced async processing See our [Contributing Guide](CONTRIBUTING.md) for detailed information on how to get started.

(back to top)

## 📄 License Open Notebook is MIT licensed. See the [LICENSE](LICENSE) file for details. **Community Support**: - 💬 [Discord Server](https://discord.gg/37XJPXfz2w) - Get help, share ideas, and connect with users - 🐛 [GitHub Issues](https://github.com/lfnovo/open-notebook/issues) - Report bugs and request features - 🌐 [Website](https://www.open-notebook.ai) - Learn more about the project

(back to top)

[contributors-shield]: https://img.shields.io/github/contributors/lfnovo/open-notebook.svg?style=for-the-badge [contributors-url]: https://github.com/lfnovo/open-notebook/graphs/contributors [forks-shield]: https://img.shields.io/github/forks/lfnovo/open-notebook.svg?style=for-the-badge [forks-url]: https://github.com/lfnovo/open-notebook/network/members [stars-shield]: https://img.shields.io/github/stars/lfnovo/open-notebook.svg?style=for-the-badge [stars-url]: https://github.com/lfnovo/open-notebook/stargazers [issues-shield]: https://img.shields.io/github/issues/lfnovo/open-notebook.svg?style=for-the-badge [issues-url]: https://github.com/lfnovo/open-notebook/issues [license-shield]: https://img.shields.io/github/license/lfnovo/open-notebook.svg?style=for-the-badge [license-url]: https://github.com/lfnovo/open-notebook/blob/master/LICENSE.txt [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 [linkedin-url]: https://linkedin.com/in/lfnovo [product-screenshot]: images/screenshot.png [Next.js]: https://img.shields.io/badge/Next.js-000000?style=for-the-badge&logo=next.js&logoColor=white [Next-url]: https://nextjs.org/ [React]: https://img.shields.io/badge/React-61DAFB?style=for-the-badge&logo=react&logoColor=black [React-url]: https://reactjs.org/ [Python]: https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=white [Python-url]: https://www.python.org/ [LangChain]: https://img.shields.io/badge/LangChain-3A3A3A?style=for-the-badge&logo=chainlink&logoColor=white [LangChain-url]: https://www.langchain.com/ [SurrealDB]: https://img.shields.io/badge/SurrealDB-FF5E00?style=for-the-badge&logo=databricks&logoColor=white [SurrealDB-url]: https://surrealdb.com/