Reading list ingest

~3 min read

Reading list ingest

Capture URLs from RSS / Pocket / Instapaper / random browser tabs, and turn them into structured reading notes.

The capture surface

There are two ways a URL becomes a note. The first is the ingest CLI, which fetches a URL (or a local file, or a whole directory) and writes a Markdown note into the vault:

lettuce ingest https://example.com/long-essay-on-cognition --vault ~/Notes

The second, agent-driven, surface is a folder of stub notes. You create one note per thing you want to read — say Reading/long-essay-on-cognition.md — with the URL in its frontmatter. A trigger then splices an > [!ai] directive into each newly created note, and whatever MCP agent you have connected picks it up and fills it in.

The trigger

A trigger does exactly one thing: when a file matching a glob is created, it splices a > [!ai] <prompt> directive into that note. It does not run an agent itself — the connected agent sees the directive via pending_directives and does the work.

# .lettuce/triggers.yml
- when: "file:created:Reading/*.md"
  prompt: |
    This note's frontmatter has a `source:` URL. Read that URL (use your own
    web tools, or `lettuce ingest <url>` to pull a clean copy into the vault),
    then rewrite this note as a structured reading note:

      - Set `title:` to the real article title and add
        `tags: [reading, source/<domain>]` to the frontmatter.
      - ## TL;DR — a 3-bullet summary.
      - ## Quotes — 2-3 quotes worth remembering, in blockquotes.
      - ## Takeaways — bulleted personal takeaways.
      - ## Links — any URLs in the original worth following.

    Skip URLs that are obviously paywalled (e.g. nyt.com, wsj.com, ft.com);
    just leave the source link without summarising.

So your capture step is: drop a stub note under Reading/ with the URL in frontmatter. For example Reading/2026-05-28-long-essay-on-cognition.md:

---
title: "Long essay on cognition"
source: "https://example.com/long-essay-on-cognition"
captured: 2026-05-28
tags: [reading]
---

The moment you create it, the trigger injects the > [!ai] directive, and the agent does the rest.

What you get

After the agent runs, Reading/2026-05-28-long-essay-on-cognition.md is a complete, structured reading note: real title, source tags, a TL;DR, quotes, takeaways, and follow-up links — built on top of the stub you dropped.

Variants

Read later, summarise later

Create the stubs whenever you find something, but let the summarising happen on a fixed cadence instead of on creation. A schedule splices a directive into one target note on a daily/weekly clock:

# .lettuce/schedules.yml
- weekly: "Sat 09:00"
  target: "Reading/_inbox.md"
  prompt: |
    Find every note under Reading/ with an empty `## TL;DR` and a `source:`
    URL. Read each, fill in the structure. Process at most 10 per run.

The connected agent picks up the directive from Reading/_inbox.md and works through the backlog.

From RSS

Combine with a feed reader that drops one stub note per item into Reading/ (each with its source: URL in frontmatter):

# A cron job that polls feeds.opml and writes a stub note per item:
feeds-to-inbox --opml feeds.opml --vault ~/Notes

Each new stub matches file:created:Reading/*.md, so the trigger fires and the agent ingests it.