| name | elfeed |
| description | Query the local elfeed RSS database (Emacs) to screen, filter, and brief feed entries. Use when asked what is new or worth reading in feeds, to search entries by feed, date, tag, unread state, or title regex, or to read the stored content of an entry. |
elfeed
scripts/elfeed-query runs an elfeed search filter against the database on
disk and prints matches newest first. It uses elfeed's own filter compiler,
so any filter string that works in the *elfeed-search* buffer works here.
A running Emacs server is used when one answers; otherwise a batch Emacs
loads the database, about one second per call.
scripts/elfeed-query [FILTER] [CHARS]
Output is one line per entry, DATE FEED TAGS TITLE LINK, tab
separated. With CHARS > 0 each line is followed by an indented excerpt of
the stored content rendered to plain text.
Steps
- Survey. Run a wide filter with
CHARS 0 to see volume per feed and
the real tag state, for example @1-week-ago. Done when you know how many
entries there are, which feeds dominate, and whether unread is tracked.
- Narrow. Add feed, tag, and title terms until the list is a candidate
set you can read in full. Title excludes (
!Released) remove release-note
churn; =feed isolates one source.
- Read. Rerun the narrowed filter with
CHARS 300 to 1500. Brief only
from stored content; an entry whose excerpt is empty or just "Comments"
has no body in the database, so say the pick is title-only.
- Brief. For each pick give the feed, date, the specific claim or
finding from the content, and the link. Group by theme when three or more
picks share one. Name what you skipped and why in one line.
Filter syntax
Terms are space separated and all must match. Regexes are Emacs regexes, so
alternation is \|, not |.
| term | meaning |
|---|
@2-days-ago | entries newer than this; @1-week-ago, @2026-09-01, @2-weeks-ago--1-week-ago for a range |
+unread | has tag; -unread lacks tag |
=lwn.net | feed URL or title matches regex |
~phoronix | feed does not match regex |
python | title matches regex (case-insensitive) |
!Released | title does not match regex |
#20 | at most 20 results |
Examples:
scripts/elfeed-query '@1-week-ago +unread'
scripts/elfeed-query '@1-week-ago =lwn.net' 350
scripts/elfeed-query '@2-weeks-ago agent\|security\|exploit'
scripts/elfeed-query '@1-week-ago =phoronix !Released !Benchmarks'
Gotchas
- Tags depend on the sync source. With elfeed-protocol (Fever, Miniflux,
ttrss) the
unread tag mirrors the server. An empty +unread result means
everything is read there, not that the filter failed. Run the survey step
before trusting tag counts.
- Aggregator feeds store links, not articles. Hacker News style feeds
keep only a comments link as content. Excerpts for those are useless;
fetch the linked page if the entry matters.
- Paywalled feeds store a lead paragraph. LWN
[$] entries keep one
paragraph. Enough to brief, not to summarise the article.
- Batch mode reads the database from disk. Entries fetched in a live
Emacs since the last
elfeed-db-save are not visible until saved.
ELFEED_DB_DIR overrides the location; ELFEED_LOAD_PATH points at
elfeed.el when neither package.el nor straight.el can find it.