#+title: Elfeed Changelog

* Version 4.1.1 (2026-08-01)

- Bugfix: Use =insert-file-contents= to load database instead of
  =find-file-noselect=. This avoids many interaction issues.
- Bugfix: Use appropriate =header-line-highlight= face instead of =highlight= face
  for header-line elements.

* Version 4.1.0 (2026-06-28)

- =elfeed-search-live-filter=: Use =while-no-input= for better responsiveness.
- =elfeed-show-fetch-link=: Display message in the buffer during fetching.
- Hide more commands in non-Elfeed buffers.
- =elfeed-search-next-separator=, =elfeed-search-previous-separator=: New commands
  to traverse date or feed title separators.
- Depend on Emacs 29.1.

* Version 4.0.1 (2026-06-11)

- Bugfix: Improve shr image insertion, compatibility with =elfeed-tube=.
- Bugfix: Prefix argument handling of =elfeed-show-next=.
- Bugfix: Call =elfeed-update-hook= also for feeds which have not been modified.
- Minor code cleanup (requires, private function namespacing).

* Version 4.0.0 (2026-06-06)

** General

- =elfeed-entry-point=: New customization option to customize =M-x elfeed= to either
  the search or tree buffer.
- =elfeed-search-mode=, =elfeed-show-mode=, =elfeed-tree-mode=: All Elfeed major modes
  derive from =special-mode=.
- Hide irrelevant commands in =M-x= if =read-extended-command-predicate= is set to
  =command-completion-default-include-p=.
- =elfeed-confirm-browse-url=: New customization option.
- =elfeed-use-libxml=: New customization option to enable parsing via =libxml=.
- New mouse menus in all Elfeed major modes.
- Mouse support in the search buffer and the header line.
- Moved elfeed-web.el to the separate repository at
  https://github.com/emacs-elfeed/elfeed-web.
- Show title and search filter in Ibuffer via the variable
  =list-buffers-directory=.
- =elfeed-last-update-relative=: New option to show last database update in the
  header line relative to the current time.
- =elfeed-csv-export=: Marked as autoloaded, =elfeed-csv= is not required anymore.

** Database

- =elfeed-db-directory=: Change default to =~/.emacs.d/elfeed=. The change is
  backward compatible. If =~/.elfeed= is present, it will be used.
- =elfeed-db-cache-timeout=: New option to keep archive content cache alive.
- =elfeed-db-save=, =elfeed-db-pack=: Reduce risk for database corruptions by
  writing to temporary files first and renaming atomically afterwards.
- =elfeed-db-gc=, =elfeed-db-pack=: Scan entry and feed meta data for =elfeed-ref=
  references. This way other packages can reference content with the reference
  kept in the metadata.
- =elfeed-db-gc=: Deduplicate strings in the database to reduce on-disk and
  in-memory size.

** Feed updates

- =elfeed-delete-feed=: New command to delete feed with all entries from the db.
- =elfeed-fetch-functions=: New hook to implement custom feed fetching. This hook
  can be used by =elfeed-protocol=, to generate a feed from an external program,
  or to modify fetched content.
- =elfeed-make-tagger=: Support matching on entry categories.
- =elfeed-update-background=: New function to update Elfeed in the background from
  a timer.
- =elfeed-feeds=: Feeds can specify per-feed options as a plist. Currently
  supported options are =:no-update=, =:fetch-link=, =:readable= and =:show-entry=.
- =elfeed-feeds=: Feeds can specify a =:no-update= option to disable feed updates.
  The feed appears still in the list for manual updates, and you can configure
  autotags for the entries which are part of the feed.
#+begin_src emacs-lisp
;; Do not update this feed
(setq elfeed-feeds
 '(("https://yhetil.org/emacs-devel/new.atom" :no-update t emacs)
   ...))
#+end_src
- Support for the JSON Feed format. JSON feeds are automatically detected,
  parsed with the Emacs JSON parser, but otherwise treated like the usual RSS or
  Atom feeds.

** Tree buffer

- New =elfeed-tree-mode= which lists all feeds and tags as a tree structure.
- =elfeed-tree=: New command which opens an =elfeed-tree-mode= buffer.

** Search buffer

- =elfeed-search=: New command as entry point.
- =elfeed-search-set-filter=, =elfeed-search-tag-all=: Filter and tag completion
  using =completing-read-multiple=. Disable completion via the variable
  =elfeed-search-completion=.
- =elfeed-search-set-filter=: Support shorter age filter syntax, e.g., =@6months=.
- =elfeed-search-date-filter=, =elfeed-search-feed-filter= and
  =elfeed-search-exclude-feed-filter=: New commands bound to ~@~, ~=~ and ~~~ to
  filter for the date or feed at point.
- =elfeed-search-(un)tag-all=, =elfeed-search-toggle-all=,
  =elfeed-search-(un)tag-all-unread=: If prefix argument is given, tag or untag
  all entries, not only the selected ones.
- =elfeed-search-remain-on-entry=: Generalized option to configure the commands
  explicitly that should remain on the entry.
- =elfeed-search-mode=: Auto-resizing of title column.
- =elfeed-search-update-delay=: New option to debounce search buffer redraws when
  feeds are updated.
- =elfeed-search-resize-delay=: New option to debounce search buffer redraws on
  window resize.
- =elfeed-search-live-delay=: New option to debounce live search filter updates.
- =elfeed-search-separator-face=: New face for the search buffer separators.
- =elfeed-search-separator-date-format=: Format string for separator date. Set to
  =nil= to disable the date separators.
- =elfeed-search-add-separators=: New search buffer update hook which adds
  separator overlays. The separators are enabled by default. Remove the hook to
  disable:
#+begin_src emacs-lisp
(remove-hook 'elfeed-search-update-hook #'elfeed-search-add-separators)
#+end_src
- =elfeed-search-group-by-feed=: New function for =elfeed-search-sort-function=.
- =elfeed-search-show-entry=: Do not mark entry as read when invoked with prefix
  argument.
- =elfeed-search-show-entry=: Invoke alternative function on the current entry if
  the key =:show-entry= is specified for a feed.
#+begin_src emacs-lisp
;; Always open entries in the browser
(setq elfeed-feeds
 '(("https://example.com/rss" :show-entry browse-url example)
   ...))
#+end_src
- =elfeed-search-mark=, =elfeed-search-unmark=: New commands for non-continuous
  selections bound to =m= and =M=.
- =elfeed-search-cycle-order=: New command bound to =o= to cycle between sort
  functions.
- =elfeed-search-reverse-order=: New command bound to =O= to reverse sort order.
- =elfeed-search-set-entry-title=, =elfeed-search-set-feed-title=: Add =t= and =T= key
  bindings to change entry and feed title.
- =elfeed-search-browse-url-secondary=: New command which open entry in the
  secondary browser. The command is bound to =B=.
- Attach =elfeed-entry=, =elfeed-feed= and =elfeed-tag= text properties in buffer text
  for more efficient lookup and mouse support.
- Improve column alignment when =variable-pitch-mode= is used or wide characters
  are displayed within entry titles.

** Show buffer

- =elfeed-show-scroll-up/down-or-next/prev=: New scroll commands which move to the
  next or previous entry when reaching the end or the beginning of the buffer.
- =elfeed-show-compose-mail=: Command to compose a mail from an entry, bound to
  the key =m=.
- =elfeed-show-update-hook=: New hook for add-ons to extend or enhance the show
  buffer.
- =elfeed-show-visit-secondary=: New command which open entry in the secondary
  browser. The command is bound to =B=.
- =elfeed-show-fetch-link=: New command to fetch link content and insert it into
  the show buffer. The command is bound to the key =f=. In order to force fetching
  press the key =C-u f=. Auto fetching can be enabled per feed with the
  =:fetch-link= option. This is a good idea for link-only feeds which come without
  content. If =:fetch-link= is set to =replace= the feed entry content is replaced
  entirely.
#+begin_src emacs-lisp
;; Automatically fetch the link content, and possibly replace entry content
(setq elfeed-feeds
 '(("https://www.debian.org/security/dsa" :fetch-link replace linux debian)
   ("https://example.com/rss" :fetch-link t)
   ...))
#+end_src
- =elfeed-show-*-face=: New faces in =elfeed-show= buffer, which are used instead of
  the faces from message.el.
- =elfeed-show-date-format=: New customization option.
- =elfeed-transform-html-functions=: New hook to implement HTML dom transformation
  before the HTML is displayed.
- =elfeed-show-readable=: Command to toggle readable mode bound to key =R=. Readable
  mode can be enabled automatically via =:readable= and even combined with
  =:fetch-link=.
#+begin_src emacs-lisp
;; Automatically fetch the link content and make it readable
(setq elfeed-feeds
 '(("https://unreadable.foo/rss" :fetch-link t :readable t example foo)
   ("https://unreadable.bar/rss" :readable t example bar)
   ...))
#+end_src

** Logging

- =elfeed-log-buffer-name=: Make =*elfeed-log*= ephemeral by default with a space in
  front of the buffer name.
- =elfeed-log-show=: New command to show the log.
- Show error count in header line. Updating the feeds resets the counter.
  Clicking on the error count will show the log buffer.

** Compatibility

- Renamed all =*-hooks= variables to the new naming convention =*-hook=.
- Removed obsolete code and code updated for upcoming Emacs 31.
- Added Compat 31 dependency.
- Depend on Emacs 28.1.
- Many small fixes and robustness improvements.

* Version 3.4.2 (2024-07-29)

- Fix =browse-url= usage (243add9e)
- Deal with various warnings from recent Emacs releases

* Version 3.4.1 (2021-02-25)

- Fix elfeed-search-last-entry and elfeed-search-first-entry

* Version 3.4.0 (2021-01-30)

- New search filter: ~ excludes matching feeds
- Support fetching feeds via file://
- Support fetching feeds via the Gopher protocol
- "End of entries" no longer appears in elfeed-search
- Support bookmarks in entries
- New customizations: elfeed-show-entry-switch, elfeed-show-entry-delete
- More extensive information from elfeed-curl-get-capabilities
- New elfeed-show command: elfeed-kill-link-url-at-point (c)
- Various other minor behavior improvements

* Version 3.3.0 (2019-11-23)

- New option: =elfeed-search-remain-on-entry=.
- More graceful handling of feed filters (=).
- Fix minor time handling issue with Emacs >= 26.1
- Load bookmarks before trying to use them.

* Version 3.2.0 (2019-08-24)

- Support for absolute date/time expressions in filters. See README.org
  for documentation and examples.
- curl's =--disable= is now default. To load your .curlrc file, use
  =--config= explicitly in =elfeed-curl-extra-arguments=.
- Re-enable curl's HTTP/2 support.
- Function =elfeed-next-link= was renamed to =elfeed-show-next-link=.
- New search buffer bindings: <, >, h, c
- Multiple authors are now parsed from entries. Reflecting this, the
  meta key for authors is now =:authors= instead of =:author=. The value
  is always a list of zero or more authors.
- New variable: =elfeed-show-unique-buffers=. Allows for displaying
  multiple show buffers at the same time.
- Various minor fixes and improvements.

* Version 3.1.0 (2018-08-29)

- Add =elfeed-show-enclosure-filename-function= for controlling
  enclosure filenames.
- Dynamically enable/disable --compressed curl option. On some systems
  curl is built without this option, so it causes errors when it is
  used.
- Minor documentation fixes.

* Version 3.0.0 (2018-05-13)

- Under Emacs 26, there is a new database index format (version 4).

Emacs 26 introduces a new "record" type, and cl-defstruct objects used
by Elfeed as its database format are now based on this type. This
unfortunately changes (and breaks) Elfeed's index format. Prior to this
release, Emacs 26 could not open an Emacs 24--25 index and vice versa.

As of Elfeed 2.4.0, Elfeed running under Emacs 26 will automatically and
quietly upgrade an Emacs 25 database index for Emacs 26. *THIS UPGRADE
IS IRREVERSIBLE* and the database can no longer be used with Emacs 25. A
one-time backup copy ("index.backup") of the original Emacs 25 index is
created before performing the upgrade. If Emacs 25, whether running this
or any prior Elfeed release, loads the new database format, it will see
an empty database as if starting from scratch.

* Version 2.3.1 (2018-05-13)

- The index is now saved when quitting the elfeed-search window ("q").
- =elfeed-link= is now autoloaded.

* Version 2.3.0 (2018-01-21)

- New ==<feed-matcher>= syntax in search filters
- Support for protocol-relative entry links (i.e. //example.com/foo/)
- New =elfeed-add-feed= =:save= key argument
- New plist-based parsed search filter format (breaking change)
- New hook: =elfeed-search-update-hook=
- New hook: =elfeed-db-unload-hook=
- New variable: =elfeed-search-sort-function=
- Connect curl with a pipe instead of a pty---a performance boost
- Minor bug fixes

* Version 2.2.0 (2017-07-09)

- Support for org links (=elfeed-link.el=)
- Added =elfeed-db-unload=
- New =elfeed-curl-retrieve= interface (breaking changes)
- New hooks =elfeed-tag-hooks= and =elfeed-untag-hooks=

* Version 2.1.1 (2017-04-02)

- Added =elfeed-show-entry-author= customization variable.
- Added =elfeed-search-unparse-filter=

* Version 2.1.0 (2017-01-25)

- New entry ID based only on domain, not whole feed
- Byte-compiled search filters (=elfeed-search-compile-filter=)
- Improved metadata persistence on entry updates
- Gather =:author= from entries
- Gather =:categories= from entries
- New =elfeed-add-feed= interface (thanks Mark Oteiza)
- New xml-query macros for faster feed parsing

* Version 2.0.1 (2016-10-30)

- Added =elfeed-curl-extra-arguments= customization
- Use =x-get-selection= instead of =x-get-selection-value=
- More flexible date handling (including Atom 0.3 support)
- Various elfeed-web fixes

* Version 2.0.0 (2016-08-26)

- Elfeed now uses curl when available (=elfeed-use-curl=)
- Windows OS now supported when using curl
- Conditional GET (ETag, =If-Modified-Since=) when using curl
- Support for xml:base in Atom feeds
- New options: =elfeed-set-max-connections=, =elfeed-set-timeout=
- New feed metadata: :canonical-url, :etag, :last-modified
- New variable: =elfeed-log-level=
- New database export option: =elfeed-csv-export=
- Additional validation for =elfeed-feeds=

* Version 1.4.1 (2016-05-25)

- Major bug fix: disable local variables when loading the index
- New command =elfeed-show-play-enclosure= (requires emms)
- Yank now works on regions in the search buffer
- Feed structs now have author field filled out
- New command =elfeed-search-set-feed-title=
- New command =elfeed-search-set-entry-title=
- Smarter handling of invalid timestamps
- Following links in show mode (=elfeed-show-visit=) takes a prefix arg

* Version 1.4.0 (2015-12-22)

- New header built on Emacs' built-in buffer headers
- New hook: =elfeed-new-entry-parse-hook=
- Emacs' bookmark support (=bookmark-set=, =bookmark-jump=)
- Emacs' desktop support (save/restore windows)
- Custom faces in search listing via =elfeed-search-face-alist=
- Dedicated log buffer, /elfeed-log/
- Scoped updates with prefix argument to =elfeed-search-fetch=
- Various bug fixes
- Fixes to feed Unicode decoding

* Version 1.3.0 (2015-11-20)

- =elfeed-search-face-alist= for custom entry faces
- =display-local-help= (C-h .) support in search
- Fixes to #n count filter

* Version 1.2.0 (2015-10-05)

- Switched to url-queue (see =url-queue-timeout=)
- New #n filter for limiting results to first n entries
- Faster live filtering
- =elfeed-version=
- Enclosure downloading
- Database size optimizations
- Search listing is more responsive to updates
- =elfeed-http-error-hooks=, =elfeed-parse-error-hooks=
- Various bug fixes

* Version 1.1.2 (2014-11-04)

- Fixed support for non-HTTP protocols
- Add ! search syntax
- Add elfeed-unjam
- Combine regexp search terms by AND instead of OR
- Link navigation keybindings (tab)
- Add elfeed-show-truncate-long-urls
- Add elfeed-search-filter customization
- Various bug fixes

* Version 1.1.1 (2014-06-14)

- Fix database corruption issue
- Properly handle URLs from XML
- Slightly better RSS date guessing
- User interface tweaks
- Add =elfeed-sort-order=
- Use tab and backtab to move between links

* Version 1.1.0 (2014-01-27)

- Autotagging support
- Better database performance
- Database packing
- Arbitrary struct metadata
- Added =elfeed-search-clipboard-type=
- Update to cl-lib from cl
- Lots of bug fixes

* Version 1.0.1 (2013-09-08)

- Live filter editing
- Support for RSS 1.0
- OPML import/export
- Fix multibyte support (thanks cellscape)
- Fix date-change database corruption
- Add n and p bindings to elfeed-search, like notmuch
- Friendlier intro header
- Automated builds
- Lots of small bug fixes

* Version 1.0.0 (2013-09-02)

- Initial release
