Open Notebook plugin thumbnail

Open Notebook

Open Notebook integration for Agent Zero with notebook browsing, source management, notes, querying, and podcast workflows.

Author twilso24 0 stars Version 0.3.0 Updated

README

๐ŸŽ™๏ธ Open Notebook Plugin for Agent Zero

Version: 0.3.0

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 tester and open notebook tester map 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:5055 access
  • 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.AsyncClient with 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 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
Hooks hooks.py Lifecycle hooks: agent_init, uninstall, config resolution

๐Ÿ”ง Installation

Prerequisites

Steps

  1. 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_notebook
    
  2. Restart Agent Zero โ€” the plugin auto-initializes via hooks.py, checking backend connectivity and dependencies.

  3. Verify connection โ€” in the Agent Zero chat:

    {
        "tool_name": "opennotebook_manage",
        "tool_args": { "action": "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_url to http://localhost:5055 if Agent Zero and Open Notebook run on the same host.


๐Ÿ› ๏ธ Tools Reference

Tool Actions 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": { "action": "notebooks" }
}

Add a Source (URL)

{
    "tool_name": "opennotebook_sources",
    "tool_args": {
        "action": "add",
        "notebook_id": "notebook:uiv698qm1c0kkbfpdp4u",
        "content": "https://example.com/article"
    }
}

Add a Source (Local File)

{
    "tool_name": "opennotebook_sources",
    "tool_args": {
        "action": "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": {
        "action": "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": {
        "action": "find",
        "notebook_id": "notebook:uiv698qm1c0kkbfpdp4u",
        "name": "clarity"
    }
}

Generate a Podcast

{
    "tool_name": "opennotebook_podcasts",
    "tool_args": {
        "action": "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": { "action": "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:notebooks to 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
audit-0.3.0 Audit fix: qualified imports, telemetry wiring, hooks.py, prompt action key, proxy config
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
โ”œโ”€โ”€ hooks.py                 # Lifecycle hooks (agent_init, uninstall)
โ”œโ”€โ”€ 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)
โ”‚
โ”œโ”€โ”€ 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