{"id":29744700,"url":"https://github.com/unorsk/blogroll","last_synced_at":"2025-07-26T05:33:44.117Z","repository":{"id":302133800,"uuid":"1011081476","full_name":"unorsk/blogroll","owner":"unorsk","description":"Minimalistic RSS reader","archived":false,"fork":false,"pushed_at":"2025-07-11T10:17:20.000Z","size":336,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-24T08:59:48.997Z","etag":null,"topics":["atom","feed","haskell","rss","rss-reader"],"latest_commit_sha":null,"homepage":"https://unorsk.github.io/blogroll/","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/unorsk.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-30T09:17:28.000Z","updated_at":"2025-07-11T10:17:17.000Z","dependencies_parsed_at":"2025-07-02T11:45:10.001Z","dependency_job_id":"3822abc3-a994-47ad-b325-fc74d2cc978e","html_url":"https://github.com/unorsk/blogroll","commit_stats":null,"previous_names":["unorsk/feed","unorsk/blogroll"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/unorsk/blogroll","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unorsk%2Fblogroll","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unorsk%2Fblogroll/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unorsk%2Fblogroll/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unorsk%2Fblogroll/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unorsk","download_url":"https://codeload.github.com/unorsk/blogroll/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unorsk%2Fblogroll/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267123573,"owners_count":24039458,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-26T02:00:08.937Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atom","feed","haskell","rss","rss-reader"],"created_at":"2025-07-26T05:33:42.090Z","updated_at":"2025-07-26T05:33:44.107Z","avatar_url":"https://github.com/unorsk.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RSS Blogroll\n\nA simple Haskell-based RSS reader that aggregates feeds and generates a beautiful HTML page with automatic GitHub Pages deployment.\n\n## Features\n\n- Fetches RSS/Atom feeds from a configurable list\n- Parses and merges entries from multiple feeds\n- Sorts entries by publication date (newest first)\n- Generates a clean HTML page with IBM Plex Sans typography\n- Automated daily updates via GitHub Actions\n- GitHub Pages deployment\n\n## Live Site\n\nThe RSS reader is automatically deployed to: **https://unorsk.github.io/blogroll/**\n\n## How It Works\n\n### 1. Feed Configuration\n\nEdit `blogroll.txt` to add or remove RSS/Atom feed URLs (one per line):\n\n```\nhttps://andrewkelley.me/rss.xml\nhttps://mitchellh.com/feed.xml\n```\n\n### 2. Automated Updates\n\nThe system uses two GitHub Actions workflows:\n\n#### Build and Release Workflow (`build-release.yml`)\n- **Triggers**: When you push a git tag (e.g., `v1.0.1`)\n- **Purpose**: Builds an optimized Haskell binary and creates a GitHub release\n- **Use case**: When you modify the Haskell code\n\n#### Daily Feed Update Workflow (`daily-feed.yml`)\n- **Triggers**: Daily at midnight UTC (automatic)\n- **Purpose**: Downloads the latest release, runs the RSS reader, and deploys to GitHub Pages\n- **Use case**: Regular feed updates\n\n## Making Changes\n\n### Updating Feed Sources\n\nTo add or remove RSS feeds:\n\n1. Edit `blogroll.txt` directly on GitHub or locally\n2. Commit and push the changes\n3. The next daily run (or manual trigger) will use the updated feed list\n\n**No new release needed** - the daily job always uses the latest `blogroll.txt` from the main branch.\n\n### Updating Code\n\nWhen you modify the Haskell code:\n\n1. Make your changes to `app/Main.hs` or `blogroll.cabal`\n2. Update the version in `blogroll.cabal` (the cabal file is the source of truth)\n3. Update `CHANGELOG.md` with release notes for the new version\n4. Commit and push the changes\n5. Create a new release using the automated script:\n   ```bash\n   ./scripts/release.sh\n   ```\n   This script automatically:\n   - Reads the current version from the cabal file\n   - Creates a git tag (e.g., `v1.0.1`) \n   - Pushes the tag to trigger the release workflow\n\n6. GitHub Actions automatically builds and releases the new version\n7. Future daily runs will use the new release\n\n## Manual Operations\n\n### Manually Trigger Daily Update\n\nTo manually run the feed update (useful for testing or immediate updates):\n\n```bash\ngh workflow run daily-feed.yml\n```\n\nYou can also trigger it from the GitHub web interface:\n1. Go to Actions tab\n2. Select \"Daily Feed Update\" workflow  \n3. Click \"Run workflow\"\n\n### Check Workflow Status\n\n```bash\n# List recent workflow runs\ngh run list --limit 5\n\n# View details of a specific run\ngh run view \u003crun-id\u003e\n\n# View logs of a failed run\ngh run view \u003crun-id\u003e --log-failed\n```\n\n### View Current Release\n\n```bash\n# List all releases\ngh release list\n\n# View latest release details\ngh release view --web\n```\n\n## Local Development\n\n### Prerequisites\n\n- GHC 9.12.2 or later\n- Cabal\n- The project uses `GHC2024` language standard\n\n### Building Locally\n\n```bash\n# Update dependencies\ncabal update\n\n# Build the project\ncabal build\n\n# Run the RSS reader\ncabal run\n\n# This generates index.html/all.html in the current directory\n```\n\n### Project Structure\n\n```\n├── app/Main.hs              # Main Haskell application\n├── blogroll.cabal           # Cabal project configuration (source of truth for version)\n├── blogroll.txt             # RSS feed URLs (one per line)\n├── CHANGELOG.md             # Release notes and version history\n├── IBMPlexSans-VariableFont_wdth,wght.ttf  # Font file\n├── scripts/\n│   └── release.sh           # Automated release script\n├── .github/workflows/\n│   ├── build-release.yml    # Release build workflow\n│   └── daily-feed.yml       # Daily update workflow\n└── README.md                # This file\n```\n\n## Troubleshooting\n\n### Daily Job Fails\n\nCheck the workflow logs:\n```bash\ngh run list --limit 3\ngh run view \u003cfailed-run-id\u003e --log-failed\n```\n\n## License\n\nMIT License - feel free to fork and modify for your own RSS reading needs!","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funorsk%2Fblogroll","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funorsk%2Fblogroll","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funorsk%2Fblogroll/lists"}