Open Notebook
Open Notebook integration for Agent Zero with notebook browsing, source management, notes, querying, and podcast workflows.
README
๐๏ธ Open Notebook Plugin for Agent Zero
Version: 0.2.1
Browse notebooks, manage sources, take notes, find content by name, and generate AI podcast episodes โ all from the Agent Zero sidebar.
A knowledge management plugin that bridges Open Notebook into Agent Zero's WebUI, providing a full sidebar panel with notebook browsing, source management, notes CRUD, name-based fuzzy lookup, and async podcast generation.
โจ Features
Notebooks
- Browse all notebooks with source/note counts and last-updated timestamps
- Hierarchical tree view for a bird's-eye overview
- Create notebooks from chat or sidebar โ natural-language requests like
create a notebook named testerandopen notebook testermap to the create flow automatically - Name-based fuzzy resolution (case-insensitive, emoji-stripped) across all tools
- Inline rename UI (no browser
prompt()dialogs)
Sources
- Import by URL, raw text, or local file path
- Auto-detection cascade: URL โ File โ Text
- Local files with known extensions (
.pdf,.doc,.docx,.txt,.md,.rtf,.odt,.epub,.html,.htm,.csv) are automatically read and uploaded โ no manual file handling needed - Processing status with colored badges (
โ completed,โณ processing,โ failed) - Source detail panel with metadata and full content viewer
- Delete sources from the panel
Notes
- Full CRUD: list, create, read, update, delete
- Collaborative note creation โ say "note this down" and the agent composes the note from conversation context
- Confirmation gates on destructive operations
- Inline editing โ edit note title and content from the โฎ menu in the Notes tab
Name-Based Lookup
- Fuzzy search for sources and notes by name within a notebook
- Case-insensitive, partial-match support
- Returns unified results with type, name, ID, and status
Podcast Generation
- Async multi-stage pipeline: outline โ transcript โ TTS audio
- Episode profile selection (format/style)
- Speaker config auto-injected from episode profile โ no manual speaker selection needed
- Real-time pipeline-stage detection (sources loaded โ outline โ transcript โ TTS)
- Episode management: list, get details, retry failed, delete
- Send transcript to Agent Zero chat
- Homepage generation with notebook selector dropdown; notebook tab shows episode list only
Infrastructure
- Reverse proxy for remote access โ frontend calls route through Agent Zero's API so remote clients can reach the Open Notebook backend without direct
localhost:5055access - File upload bridge โ base64 multipart encoding allows file uploads through the proxy
- Read-only mode โ optionally prevent all write/delete operations
- Confirmation gates โ optionally require confirmation before destructive operations
- Shared HTTP client โ lazy-singleton
httpx.AsyncClientwith connection pooling
๐๏ธ Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ AGENT ZERO FRAMEWORK โ
โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ browse โ โ manage โ โ notes โ โ sources โ โ
โ โ ๐ โ โ โ๏ธ โ โ ๐ โ โ ๐ โ โ
โ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โ
โ โโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโผโโโโโโโ โ
โ โ query โ โโโโโโโโโโโโโโ โ
โ โ ๐ค find โ โ podcasts โ โ
โ โโโโโโโโฌโโโโโโโ โ ๐๏ธ async โ โ
โ โ โโโโโโโฌโโโโโโโ โ
โ โผ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ REVERSE PROXY (api/) โ โ
โ โ JSON + binary + file uploads โ โ
โ โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโผโโโโโโโโโโโ
โ OPEN NOTEBOOK โ
โ host:5055 โ
โ Notebooks ยท RAG โ
โ TTS ยท Embeddings โ
โโโโโโโโโโโโโโโโโโโโโโโ
Plugin Components
| Component | File(s) | Purpose |
|---|---|---|
| Tools (6) | tools/opennotebook_*.py |
Agent-facing tools with method routing |
| Reverse Proxy | api/proxy.py |
Bridges frontend โ Open Notebook backend |
| HTTP Client | client.py |
Lazy-singleton httpx.AsyncClient with pooling |
| Config | config.py, default_config.yaml |
Typed settings with env-var fallback |
| Shared Helpers | shared.py, tools/shared.py |
Date/status formatting, name resolution, error translation |
| Error Handler | errors.py |
HTTP/httpx exceptions โ human-readable messages |
| WebUI Store | webui/open_notebook-store.js |
Alpine.js reactive store (1,711 lines) |
| Canvas Panel | webui/canvas-panel.html |
Sidebar UI template (646 lines) |
| Styles | webui/open_notebook.css |
Panel styling |
| Skills (3) | skills/ |
Meta-skill, podcast workflow, research workflow |
| Prompts (6) | prompts/default/ |
Tool descriptions injected into agent context |
| Setup | execute.py |
Connectivity check and dependency installer |
๐ง Installation
Prerequisites
- Agent Zero running (Docker or local)
- Open Notebook backend running on port
5055
Steps
Install the plugin from the Agent Zero Plugins UI, or clone into your plugins directory:
cd /a0/usr/plugins/ git clone https://github.com/twilso24/open_notebook_agent_zero.git open_notebookRun setup โ click the setup button in Plugins UI, or run manually:
python execute.pyThis checks backend connectivity and installs the
websocketsdependency if needed.Verify connection โ in the Agent Zero chat:
{ "tool_name": "opennotebook_manage", "tool_args": { "method": "status" } }
Configuration
Settings are managed via the Plugins UI or default_config.yaml:
| Setting | Default | Description |
|---|---|---|
api_url |
http://host.docker.internal:5055 |
Open Notebook backend URL (Docker Desktop) |
read_only |
false |
Prevents all write/delete operations |
confirmations |
true |
Requires confirmation before destructive operations |
Environment variable OPEN_NOTEBOOK_API_URL overrides api_url if set.
Non-Docker setups: Set
api_urltohttp://localhost:5055if Agent Zero and Open Notebook run on the same host.
๐ ๏ธ Tools Reference
| Tool | Methods | Description |
|---|---|---|
opennotebook_browse |
notebooks, notebook, tree |
Explore notebooks, inspect details, hierarchical overview |
opennotebook_manage |
status, config, create |
Check connectivity, view settings, create notebooks |
opennotebook_sources |
list, add, read, delete |
Manage content sources with auto-type detection |
opennotebook_notes |
list, create, read, update, delete |
Full CRUD for notebook notes |
opennotebook_query |
find |
Name-based fuzzy lookup for sources and notes |
opennotebook_podcasts |
profiles, list, get, generate, status, retry, delete |
Async podcast episode generation and management |
Skills
| Skill | Trigger | Purpose |
|---|---|---|
open_notebook |
"open notebook", "knowledge base", "notebooks" | Meta-skill: tool map, user journeys, setup guidance |
open_notebook-podcast |
"create podcast", "podcast generation" | Full async workflow with polling strategy and timing |
open_notebook-research |
"find source", "research topic", "look up" | Name-based lookup workflow with cross-tool navigation |
๐ Usage Examples
Browse Notebooks
{
"tool_name": "opennotebook_browse",
"tool_args": { "method": "notebooks" }
}
Add a Source (URL)
{
"tool_name": "opennotebook_sources",
"tool_args": {
"method": "add",
"notebook_id": "notebook:uiv698qm1c0kkbfpdp4u",
"content": "https://example.com/article"
}
}
Add a Source (Local File)
{
"tool_name": "opennotebook_sources",
"tool_args": {
"method": "add",
"notebook_id": "notebook:uiv698qm1c0kkbfpdp4u",
"content": "/path/to/report.pdf"
}
}
The file is automatically detected, read, and uploaded โ no manual processing needed.
Create a Note
{
"tool_name": "opennotebook_notes",
"tool_args": {
"method": "create",
"notebook_id": "notebook:uiv698qm1c0kkbfpdp4u",
"title": "Key Findings",
"content": "The clarity optimization improved average scores by 18.7 points."
}
}
Find an Item by Name
{
"tool_name": "opennotebook_query",
"tool_args": {
"method": "find",
"notebook_id": "notebook:uiv698qm1c0kkbfpdp4u",
"name": "clarity"
}
}
Generate a Podcast
{
"tool_name": "opennotebook_podcasts",
"tool_args": {
"method": "generate",
"episode_profile": "tech_discussion",
"episode_name": "Deep Dive: Clarity Optimization",
"notebook_id": "notebook:uiv698qm1c0kkbfpdp4u"
}
}
Returns a job_id โ wait 3โ5 minutes, then check status:
{
"tool_name": "opennotebook_podcasts",
"tool_args": { "method": "status", "job_id": "returned-job-id" }
}
๐๏ธ Podcast Pipeline
Podcast generation is a multi-stage async workflow:
Sources โ Outline โ Transcript โ TTS Audio โ Episode
| Stage | Typical Duration |
|---|---|
| Outline generation | 2โ5 min |
| Transcript generation | 3โ8 min |
| TTS audio rendering | 5โ15 min |
| Total | 10โ25 min |
Speaker configuration is automatically fetched from the selected episode profile's speaker_config โ the proxy injects it transparently for backend compatibility. No separate speaker selection is needed from the plugin.
๐ Design Principles
- Action guidance โ every tool response tells the user what to do next
- Cross-tool navigation โ messages reference related tools (e.g., "Use
opennotebook_browse:notebooksto see all notebooks") - Inline comments โ every method has docstrings explaining purpose and behavior
- Error recovery โ HTTP exceptions are translated into human-readable messages with suggested fixes
- Confirmation gates โ destructive operations require explicit confirmation when enabled
๐ Changelog
Key milestones from the commit history:
| Commit | Description |
|---|---|
933d062 |
Feature: inline note editing UI for existing notes (version 0.2.1) |
e8c425b |
Fix rename notebook/session: replace prompt() with inline UI |
185b408 |
Proxy auto-inject: dynamically fetch speaker_config from episode profile for backend compatibility |
a2c8cc0 |
Remove speaker_profile from podcast generation โ only pass episode name, profile, content, and instructions |
81ad72e |
Refactor: remove generation features from Podcasts tab (episodes list only) |
4e85c61 |
Fix: restore homepage podcast with notebook selector dropdown |
6929366 |
Feature: notebook-scoped podcast generation with source content mode toggle |
9707af9 |
Feature: source detail panel with metadata and content viewer |
b006908 |
Fix: enable file uploads through base64 multipart proxy bridge |
0bce212 |
Feature: notebook list refresh button |
9941298 |
Major plugin overhaul: fix CRUD workflow, remove beta features, fix UI |
845379b |
Fix: resolve 6 bugs in sources and query tools |
๐ Project Structure
open_notebook/
โโโ plugin.yaml # Plugin manifest
โโโ config.py # Settings access (api_url, read_only, confirmations)
โโโ default_config.yaml # Default configuration values
โโโ client.py # Shared httpx.AsyncClient singleton
โโโ shared.py # Formatting, name resolution, error routing
โโโ errors.py # HTTP/httpx exception translator
โโโ execute.py # Setup script (connectivity + deps)
โโโ requirements.txt # httpx>=0.24.0
โโโ LICENSE # MIT
โ
โโโ api/
โ โโโ proxy.py # Reverse proxy (JSON + binary + uploads)
โ
โโโ tools/
โ โโโ opennotebook_browse.py # Notebook discovery (272 lines)
โ โโโ opennotebook_manage.py # Status, config, create (215 lines)
โ โโโ opennotebook_sources.py # Source management (785 lines)
โ โโโ opennotebook_notes.py # Notes CRUD (536 lines)
โ โโโ opennotebook_query.py # Name-based lookup (174 lines)
โ โโโ opennotebook_podcasts.py # Podcast generation (654 lines)
โ โโโ shared.py # Tool-level shared helpers (146 lines)
โ
โโโ prompts/default/ # Agent tool descriptions (6 files)
โ
โโโ skills/
โ โโโ open_notebook/SKILL.md # Meta-skill
โ โโโ open_notebook-podcast/SKILL.md # Async podcast workflow
โ โโโ open_notebook-research/SKILL.md # Name-based lookup workflow
โ
โโโ webui/
โ โโโ open_notebook-store.js # Alpine.js store (1,674 lines)
โ โโโ canvas-panel.html # Sidebar UI template (622 lines)
โ โโโ open_notebook.css # Panel styles
โ โโโ thumbnail.jpg # Plugin thumbnail
โ
โโโ extensions/
โโโ python/ # Backend lifecycle hooks
โโโ webui/ # Frontend lifecycle hooks
๐ License
MIT โ see LICENSE
Built for Agent Zero โข Powered by Open Notebook