Book notes agent
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.
Related
Recipes/05 Reading list ingest — capturing articles
Recipes/12 Learning in public — publishing extracted insights