Skip to content

holzerjm/ebcprep-orchestrator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ebcprep

License: MIT Python Built with: uv NotebookLM Last commit Issues

Automate creation and maintenance of per-executive NotebookLMs from a Google Sheet feeder.

For each row in the feeder sheet, ebcprep:

  1. Looks up (or creates) a notebook for that executive.
  2. Adds the meeting's prep doc as a Drive source to the notebook.
  3. Renames the source so it reads {company} — {date} {start}–{end}.
  4. Shares the notebook with the executive (once, on first sync).

Re-runs are idempotent — meeting rows are deduplicated by content hash, so unchanged rows are skipped.

Documentation

  • docs/USER_GUIDE.md — step-by-step guide for non-technical operators (install, GCP setup, sheet preparation, daily use, troubleshooting).
  • docs/ARCHITECTURE.md — design decisions, module responsibilities, sync algorithm, idempotency model, extension points.

The rest of this README is a quick reference.

Feeder spreadsheet layout

Header row 1, data starting row 2.

Column Meaning
B company name
D meeting date
E start time
F end time
H executive name
I Google Doc URL
L executive email

Other columns are ignored.

Prerequisites

  1. nlm CLI installed and authenticated under a named profile:

    uv tool install notebooklm-mcp-cli
    nlm login --profile ebcprep

    The notebooks are created in this Google account; collaborators are invited from it.

  2. GCP service account with Sheets read access:

    • Create a service account in any GCP project.
    • Generate a JSON key, save it locally.
    • In Google Sheets, share the feeder sheet with the service account's email (...@<project>.iam.gserviceaccount.com) as Viewer.

Install

cd ebcprep-orchestrator
uv tool install --from . ebcprep
# or for development:
uv pip install -e .

Configure

cp .env.example .env
# edit .env: set EBCPREP_SERVICE_ACCOUNT_JSON, EBCPREP_SHEET_ID, EBCPREP_NLM_PROFILE
ebcprep doctor

Optional: defaults.toml

If you want always-included collaborators (people who get added to every notebook in addition to the executive) or default sources (URLs added to every notebook), create a defaults.toml:

cp defaults.toml.example defaults.toml
# edit defaults.toml
ebcprep doctor   # confirm the entries are picked up

Re-running ebcprep sync is safe — invites and sources are only added if not already present on the notebook.

Skip inviting executives

If you want to manage notebook access only via always_collaborator (e.g. a shared ebc-team@ group) and not invite the executives directly:

  • One-time, per run: ebcprep sync --no-invite-execs
  • Permanently in .env: EBCPREP_SKIP_EXEC_INVITE=true

Use

# Preview what would happen, no writes
ebcprep sync --dry-run

# Real sync
ebcprep sync

# Limit to one exec
ebcprep sync --only-exec "Jane Doe"

# Show last run + per-exec totals
ebcprep status

# List exec → notebook URL
ebcprep execs

# Show one exec's meetings (from local state)
ebcprep meetings "Jane Doe"

State

Local SQLite DB at data/ebcprep.db:

  • executives — name, email, notebook_id, share status
  • meetings — one row per (exec, doc_url); content-hash primary key for dedup
  • sync_runs — one row per ebcprep sync invocation

The DB is the source of truth for "what's already been ingested." Delete it to force a full re-sync (existing notebooks will be matched by title and reused, not duplicated).

What it does NOT do (yet)

  • Remove sources when a row is deleted from the sheet (history is preserved).
  • Update source titles when sheet metadata changes for an existing row.
  • Generate AI briefings (planned for Phase 3).
  • Web portal (planned for Phase 2 — ebcprep[portal] extra).

Architecture

Google Sheet (feeder) ──gspread──▶ ebcprep ──notebooklm_tools.services──▶ NotebookLM
                                      │
                                      ├─ SQLite (state, dedup, sync history)
                                      └─ rich-formatted CLI output

ebcprep does not subprocess nlm — it imports notebooklm_tools.services directly and calls them with a client obtained via notebooklm_tools.cli.utils.get_client(profile).

About

Automate per-executive NotebookLM notebooks from a Google Sheet feeder. CLI + static portal.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors