FeedMD is a CLI Utility used to create a personal daily digest of your favourite news sources by converting RSS and Atom feeds into markdown files. These files can read in your markdown viewer of choice such as Obsidian or used as part of a static site build process such as Hugo.
- Convert RSS/ Atom feeds to markdown files
- Ability to template to modify the markdown output to fit your particular workflow
- Specify both the date and the timezone to generate the daily digest for
- Only parses as much of the document as needed for the given timeframe
Download the latest release for your platform here: https://github.com/myquay/feedmd/releases or clone the repository and compile for your target system. Run it as you would any other self-contained executable.
Before you generate your first digest, you need to configure which feeds you are interested in. This is configured in a file called config.yml.
Example config file
feeds:
- https://brandur.org/articles.atom
- https://michael-mckenna.com/blog/atom.xml
- https://waitbutwhy.com/feed
- https://www.joelonsoftware.com/feed/
- https://jvns.ca/atom.xml
- https://feeds.hanselman.com/ScottHanselman
- https://blog.bonnieeisenman.com/feed.xml
time_zone: Pacific/Aucklandfeeds:Array of feeds to processtime_zone:The time zone used to define the time boundaries for the given date
If you don't want to create the files from scratch you can run the init command to generate a sample config and template file (feedmd init).
Use the build command to generate the digest, by default it will generate for the day prior (feedmd build).
This will output a file called {digest_date}.md with a summary of all new items from the feeds for that date.
Some common configuration options for the build command are:
--date: Specify the date to generate the digest for, in yyyy-mm-dd format e.g. (2023-07-15)-dor--destination: Location to output the digest files to
See the reference section at the end of this document for a full list of commands and options
FeedMD supports templating to modify the output of the markdown file, this is to give the tool flexibility to fit into different workflows.
The Liquid templating language is used, the context available follows this structure:
{
Date: "2023-07-15",
Feeds: [{
Title: "Feed title", //String of name of feed
Link: "Website link", //Uri of link to website
LastModified: ... //DateTime when feed was last modified
Items:[{
Title: "Item title", //String of name of item, e.g. title of blog post
Link: "Item link", //Uri of link to item, e.g. link to blog post
Summary: "Item summary", //String of summary of item e.g. blog post summary
Content: "Item content", //String of content of item e.g. blog post content
PublishDate: ... //DateTime when item was published e.g. blog post publish date
}]
}]
}This is the template used by default, can be modified by running feedmd init and modifiying the generated template.tmd file.
---
publishDate: {{ Date }}
title: 'RSS Daily Digest: {{ Date }}'
url: /digest/{{ Date }}
---
{% for feed in Feeds -%}
### [{{ feed.Title }}]({{ feed.Link }})
{% for item in feed.Items -%}
* [{{ item.Title }}]({{ item.Link }})
{% endfor %}
{% else -%}
_No feeds today!_
{% endfor %}I'm using this to generate the diests for my RSS reader which you can view the source for here. A GitHub action runs FeedMD overnight which generates a new markdown file and saves it to the reader repository. The reader is a markdown website which is regenerated and deployed each time a new digest is created.
Let me know what other interesting uses you find for me and I can place them here.
Full reference for the FeedMD utility
--date: Specify the date to generate the digest for, in yyyy-mm-dd format e.g. (2023-07-15)-dor--destination: Location to output the digest files to-cor--configuration: Location of the configuration file, defaults to./config.yml- fails if not present-tor--template: Location of the template file, defaults to./template.tmd- if not present uses a default template saved as an embedded resource in the executable.--tz: Time zone, overrides the one defined in theconfig.ymlfile-vor--verbose: Generate more output about what's going on--strict: Parse in strict mode (e.g. do not process DTDs), defaults tofalse--maxDtdCharacters: Maximum number of characters to read when parsing DTDs, defaults to1024