A simple Haskell-based RSS reader that aggregates feeds and generates a beautiful HTML page with automatic GitHub Pages deployment.
- Fetches RSS/Atom feeds from a configurable list
- Parses and merges entries from multiple feeds
- Sorts entries by publication date (newest first)
- Generates a clean HTML page with IBM Plex Sans typography
- Automated daily updates via GitHub Actions
- GitHub Pages deployment
The RSS reader is automatically deployed to: https://unorsk.github.io/blogroll/
Edit blogroll.txt
to add or remove RSS/Atom feed URLs (one per line):
https://andrewkelley.me/rss.xml
https://mitchellh.com/feed.xml
The system uses two GitHub Actions workflows:
- Triggers: When you push a git tag (e.g.,
v1.0.1
) - Purpose: Builds an optimized Haskell binary and creates a GitHub release
- Use case: When you modify the Haskell code
- Triggers: Daily at midnight UTC (automatic)
- Purpose: Downloads the latest release, runs the RSS reader, and deploys to GitHub Pages
- Use case: Regular feed updates
To add or remove RSS feeds:
- Edit
blogroll.txt
directly on GitHub or locally - Commit and push the changes
- The next daily run (or manual trigger) will use the updated feed list
No new release needed - the daily job always uses the latest blogroll.txt
from the main branch.
When you modify the Haskell code:
-
Make your changes to
app/Main.hs
orblogroll.cabal
-
Update the version in
blogroll.cabal
(the cabal file is the source of truth) -
Update
CHANGELOG.md
with release notes for the new version -
Commit and push the changes
-
Create a new release using the automated script:
./scripts/release.sh
This script automatically:
- Reads the current version from the cabal file
- Creates a git tag (e.g.,
v1.0.1
) - Pushes the tag to trigger the release workflow
-
GitHub Actions automatically builds and releases the new version
-
Future daily runs will use the new release
To manually run the feed update (useful for testing or immediate updates):
gh workflow run daily-feed.yml
You can also trigger it from the GitHub web interface:
- Go to Actions tab
- Select "Daily Feed Update" workflow
- Click "Run workflow"
# List recent workflow runs
gh run list --limit 5
# View details of a specific run
gh run view <run-id>
# View logs of a failed run
gh run view <run-id> --log-failed
# List all releases
gh release list
# View latest release details
gh release view --web
- GHC 9.12.2 or later
- Cabal
- The project uses
GHC2024
language standard
# Update dependencies
cabal update
# Build the project
cabal build
# Run the RSS reader
cabal run
# This generates index.html/all.html in the current directory
├── app/Main.hs # Main Haskell application
├── blogroll.cabal # Cabal project configuration (source of truth for version)
├── blogroll.txt # RSS feed URLs (one per line)
├── CHANGELOG.md # Release notes and version history
├── IBMPlexSans-VariableFont_wdth,wght.ttf # Font file
├── scripts/
│ └── release.sh # Automated release script
├── .github/workflows/
│ ├── build-release.yml # Release build workflow
│ └── daily-feed.yml # Daily update workflow
└── README.md # This file
Check the workflow logs:
gh run list --limit 3
gh run view <failed-run-id> --log-failed
MIT License - feel free to fork and modify for your own RSS reading needs!