Book notes agent

~4 min read

Book notes agent

A consistent format for book notes, with automatic quote extraction, theme identification, and bidirectional linking to other books on similar topics.

Setup

Convention

Book notes live in Books/<author> - <title>.md:

---
title: "Designing Data-Intensive Applications"
author: "Martin Kleppmann"
isbn: "978-1449373320"
status: reading       # to-read | reading | finished | abandoned
started: 2026-05-01
finished:
tags: [book]
---

# Designing Data-Intensive Applications

> [!info]
> ## Top of mind: durability, partitioning, time

## Notes
...

The trigger

A trigger fires on file:created for a glob and splices a > [!ai] <prompt> directive into the new note. The connected MCP agent picks the directive up via pending_directives and does the actual work — reading, extracting, cross-linking, and proposing edits. So the trigger seeds every new book note with the full processing brief:

# .lettuce/triggers.yml
- when: "file:created:Books/*.md"
  prompt: |
    Process this book note once it's marked finished:

    1. Read it in full.
    2. Extract 3-7 standout quotes (look for blockquotes, italicised lines,
       or "> " prefixed lines). Format under a `## Quotes` section.
    3. Identify 3-5 themes. For each, search for other books that
       touch the theme; cross-link with [[Other Book]].
    4. Write a `## In one sentence` summary.
    5. Write a `## In three paragraphs` summary.
    6. Propose adding the structure to the note (preserve existing content).

    Don't change frontmatter; just propose body additions.

The directive lands in the note the moment it’s created. Whatever agent you have connected (configured via env vars or Settings → AI providers) sees it through pending_directives and proposes the additions; you review and apply them.

What you get

A book note evolves from your reading notes plus the structured agent additions:

---
title: "Designing Data-Intensive Applications"
author: "Martin Kleppmann"
status: finished
started: 2026-05-01
finished: 2026-05-28
tags: [book, distributed-systems]
---

# Designing Data-Intensive Applications

## In one sentence

A masterful synthesis of the trade-offs in storage, replication, partitioning, and consistency that underlie every real distributed system.

## In three paragraphs

[3 paragraphs the agent wrote]

## Themes

- **Eventual consistency** — covered also in [[Henry Robinson - Distributed Systems Theory]].
- **Time and ordering** — see [[Leslie Lamport - Time, Clocks, and the Ordering of Events]].
- **CRDTs** — touched on in [[Marc Shapiro - CRDT Paper]].

## Quotes

> "A bird's eye view: storage engines fall into two main camps — log-structured (LSM-trees) and update-in-place (B-trees)."

> "There is no fundamental reason why a database can't be a stream."

[3-7 more quotes]

## Notes
[your original notes preserved here]

Variations

Reading list (Want-to-read)

A second trigger on the same folder seeds new notes with a metadata-fetch brief. The connected agent does the fetching and proposes the edits:

- when: "file:created:Books/*.md"
  prompt: |
    If this note's status is to-read, fetch metadata (Open Library or similar)
    and propose updating frontmatter with isbn, page-count, year, publisher.
    Then propose a 2-paragraph "Why I want to read this" placeholder
    prompting the human to fill it in.

Reading streaks

A schedule splices its prompt as a > [!ai] <prompt> directive into a fixed target note at the given time; the connected agent picks it up via pending_directives. Point it at a standing “reading log” note:

# .lettuce/schedules.yml
- daily: "21:00"
  target: "Books/Reading log.md"
  prompt: |
    List notes in Books/ where status is reading.
    If any haven't been touched in 3 days, add a "Pick up where you left off"
    line for each here in the reading log.

Quote of the day

- daily: "08:00"
  target: "Daily/Quotes.md"
  prompt: |
    Pick a random `> "..."` blockquote from Books/ and add it under a
    `## Quote of the day` heading with the date.