---
id: obsidian-dataweave
name: 'ObsidianDataWeave: NotebookLM, Atomization, and LLM Wiki'
summary: >-
  KISA's skill: turns Claude Code / Codex into a NotebookLM control panel + .docx import
  with Zettelkasten atomization + a compiled LLM Wiki layer + FTS5 memory across the whole
  Obsidian vault. All programmatic, all into your vault, with no external search dependencies.
type: skill
author: kisa
recommended: false
added: 2026-07-04
tags: [obsidian, notebooklm, zettelkasten, llm-wiki, fts5, memory, notes]
source: https://github.com/howdeploy/ObsidianDataWeave
description: >-
  Use when the user wants to control NotebookLM programmatically, import .docx into an
  Obsidian vault as atomic Zettelkasten notes, build a compiled LLM Wiki layer, or
  full-text-search the whole vault. Claude Code and Codex both supported.
license: MIT
---

# ObsidianDataWeave

Turns Claude Code and Codex into a full control panel for NotebookLM and your Obsidian
vault. You run deep research, manage sources, and pull notes out of notebooks — all with a
single natural-language command. In parallel, it imports `.docx` from Google Drive and
atomizes them into Zettelkasten notes with a MOC, tags, and wikilinks. On top — an isolated
**LLM Wiki** layer (a compiled base in the Karpathy style), and **FTS5 memory** — a full-text
index of the entire vault without a single external dependency. Public: `howdeploy/ObsidianDataWeave`, MIT.

Both clients are supported: Claude Code (skill) and Codex (`AGENTS.md`).

## Four Layers

1. **NotebookLM → Obsidian.** Programmatic control of NotebookLM through `notebooklm-py` as
   a library (not the CLI — strictly one-shot, no retry duplication). Deep/fast research, source
   management, dedup, note extraction, and atomization into the vault.
2. **.docx → Obsidian.** Import from Google Drive (rclone) → parse → atomize → write.
3. **LLM Wiki.** A compiled wiki on top of the atomic notes: it accumulates through an explicit
   merge (not RAG, not a recompute on every query), linked with `[[wikilinks]]`.
4. **FTS5 memory.** A local full-text index of the whole vault on stdlib SQLite, bm25 +
   snippets, auto-updates after every write. Search for agents.

## Installation

```bash
git clone https://github.com/howdeploy/ObsidianDataWeave.git
cd ObsidianDataWeave
bash install.sh --vault-path "/path/to/your/vault"
```

The installer checks for Python 3.10+, installs the dependencies (`python-docx`, `pyyaml`), creates
a `config.toml` with the vault path, registers the skill globally in `~/.claude/skills/obsidian-dataweave/`,
and appends a block to `~/.claude/CLAUDE.md`. After installation the skill works from any directory.

Modes: `--mode claude` (default), `--mode codex` (checks `AGENTS.md`), `--mode local`
(dependencies + config only). Updating is idempotent: `git pull && bash install.sh`.

## How to Use

After installation, just tell the agent in natural language:

| What to say | What happens |
|---|---|
| `process MyDocument.docx` | Download → parse → atomize → write into the vault |
| `process note "Title"` | Enrich or atomize an existing note |
| `process contacts "Contacts"` | A note with contacts → personal cards + Networking MOC |
| `run research in notebook "<id>" "<query>"` | Deep research in NotebookLM via the API |
| `clean duplicates in notebook "<id>"` | Dedup sources in the notebook |
| `create wiki "<slug>"` | Skeleton of a new LLM Wiki space (project/corpus, RU/EN) |
| `build wiki "<slug>"` | Compile the raw material into pages (guard on `[[wikilinks]]`) |
| `search notes "<query>"` | FTS5 search across the whole vault (bm25 + snippets) |

Processing modes: **Enrich** (short note → tags/links/expansion, 1→1), **Atomize**
(long → atomic notes + MOC, 1→N), **Contacts** (contacts → cards + Networking MOC).

## LLM Wiki

The third knowledge layer is a compiled wiki in the Karpathy style. It lives in the isolated folder
`<vault>/LLM Wiki/<slug>/`; atomic notes don't go there. It accumulates through an explicit
merge: existing `[[wikilinks]]` must be preserved, otherwise compile fails with
`WIKI_LINKS_LOST`. Two modes: **project** (fixed core pages: overview,
architecture, components, workflows, glossary…) and **corpus** (only entities/concepts grow).

```bash
python3 scripts/wiki_init.py demo --mode project --title "Demo Project"
python3 scripts/wiki_ingest.py demo path/to/article.md --kind articles
python3 scripts/wiki_compile.py demo --since-last-compile
python3 scripts/wiki_lint.py demo --strict
```

All scripts write through a single writer, `vault_writer.py` — the atomic pipelines and the wiki
share one write point.

## NotebookLM: First Login

The Google session is saved in `~/.notebooklm/storage_state.json` — login is one-time.
```bash
python3 -m venv .venv
.venv/bin/python scripts/notebooklm_setup.py --skip-login
# in a SEPARATE terminal window (needs a real TTY):
.venv/bin/notebooklm login   # log in to Google in Chromium → come back → ENTER
```
Then: `process_notebook.py <notebook_id>` (id is the last segment of the notebook URL),
`research_notebook.py run "<id>" "<query>" --mode deep`.

## Requirements

- Python 3.10+ (3.11+ recommended), [rclone](https://rclone.org/) with access to Google Drive
  (for `.docx`), Claude Code or Codex.
- SQLite with FTS5 (stdlib `sqlite3`) — no separate DBMS needed; `doctor.py` checks this.
- **Obsidian plugins:** [Local REST API](https://github.com/coddingtonbear/obsidian-local-rest-api)
  (HTTP interface to the vault) + [MCP Obsidian](https://github.com/MarkusPfundstein/mcp-obsidian)
  (MCP bridge Claude Code ↔ Obsidian).

Related: [NotebookLM++](https://github.com/howdeploy/notebooklmplusplus) — a Chrome extension
for bulk-importing sources into NotebookLM (web, YouTube, playlists, PDF snapshots).
