{"id":19565513,"url":"https://github.com/swaldman/unify-rss","last_synced_at":"2026-02-28T12:02:13.199Z","repository":{"id":183566587,"uuid":"670316110","full_name":"swaldman/unify-rss","owner":"swaldman","description":"A static generator or server that downloads multiple RSS feeds and combines them into a single merged feed.","archived":false,"fork":false,"pushed_at":"2026-01-25T04:34:39.000Z","size":138,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-25T18:58:29.175Z","etag":null,"topics":["rss","rss-aggregator","rss-generator","tapir","zio","zio-http"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swaldman.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2023-07-24T19:20:30.000Z","updated_at":"2026-01-25T04:34:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"befa84f2-165f-4244-9711-c93a5be9a785","html_url":"https://github.com/swaldman/unify-rss","commit_stats":null,"previous_names":["swaldman/unify-rss"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/swaldman/unify-rss","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Funify-rss","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Funify-rss/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Funify-rss/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Funify-rss/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swaldman","download_url":"https://codeload.github.com/swaldman/unify-rss/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Funify-rss/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29933021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T09:58:13.507Z","status":"ssl_error","status_checked_at":"2026-02-28T09:57:57.047Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["rss","rss-aggregator","rss-generator","tapir","zio","zio-http"],"created_at":"2024-11-11T05:27:21.998Z","updated_at":"2026-02-28T12:02:13.169Z","avatar_url":"https://github.com/swaldman.png","language":"Scala","readme":"# unify-rss\n\nI'm dividing my writing output among a number of blogs\nand microblogging sites these days. I wanted to offer\nRSS feeds that would let you subscribe to all of these at\nonce, in the unlikely and rather discreditable circumstance\nthat you like to read what I write. So...\n\nThis application let's you configure any number of \"synthetic\" RSS feeds, each one built\nby merging any number of source feeds.\n\nYou can specify source feeds directly and/or subscribe to\n[OPML feeds](https://indieweb.org/OPML), which the application will follow as the source list changes\ndynamically over time.\n\n### library + script\n\n_unify rss_ is most easily run in [library + script](https://tech.interfluidity.com/2023/11/14/library--script-vs-application--config-file/index.html) style.\n\nYou'll [find the library on Maven Central](https://central.sonatype.com/artifact/com.mchange/unify-rss_3).\n\nIn a [scala-cli](https://scala-cli.virtuslab.org/) script, just configure your application just by building\neither a [`StaticGenConfig`](https://javadoc.io/static/com.mchange/unify-rss_3/0.0.2/com/mchange/unifyrss/StaticGenConfig.html) or [`DaemonConfig`](https://javadoc.io/static/com.mchange/unify-rss_3/0.0.2/com/mchange/unifyrss/DaemonConfig.html) object.\n\nIn either case, the heart of your definition will be a `Set` of [`MergedFeed`](https://javadoc.io/static/com.mchange/unify-rss_3/0.0.2/com/mchange/unifyrss/MergedFeed.html) objects.\n`MergedFeed` is a `trait`; the class [`MergedFeed.Default`](https://javadoc.io/static/com.mchange/unify-rss_3/0.0.2/com/mchange/unifyrss/MergedFeed$$Default.html) provides a convenient implementation\nEach merged feed can be constituted of any number of individual RSS feeds, or sources of RSS feeds\nlike OPML feeds.\n\nOnce you have defined your config object, your script simply runs a method of the [`ScriptEntry`](https://javadoc.io/static/com.mchange/unify-rss_3/0.0.2/com/mchange/unifyrss/ScriptEntry$.html).\n\nAnd that's it!\n\n#### serve feeds as a daemon\n\nYou can periodically merge feeds in memory and have a daemon serve them. Just call `ScriptEntry.startupDaemon( daemonConfig : DaemonCofig )`.\n\nYou'll usually deploy your script with _systemd_, a `Type=simple` daemon.\n\n#### static feed generation\n\nYou can generate merged feeds as static files, to be served as static files. Just call `ScriptEntry.performStaticGen( sgc: StaticGenConfig )`.\n\nYou'll usually deploy your script with _systemd_, a `Type=simple` service that will run, regenerate your feeds, then simply die. \nUse a _systemd_ timer to periodically rerun and regenerate your feeds.\n\n### examples\n\nYou can find a (rather complicated, alas) example\n[script](https://github.com/swaldman/unify-rss-interfluidity/blob/main/unify-rss-interfluidity) with\n_systemd_ [unit](https://github.com/swaldman/unify-rss-interfluidity/blob/main/unify-rss.service) and\n[timer](https://github.com/swaldman/unify-rss-interfluidity/blob/main/unify-rss.timer)\nfiles [here](https://github.com/swaldman/unify-rss-interfluidity).\n\n### shortcomings\n\n* RSS feeds are supposed to link to the site that produces them, but since these feeds\nare generated from multiple sites, we make up a \"stub site\" link back to this service.\nI have not yet implemented the serving of those \"stub sites\" yet though.\n\n### elsewhere\n\nSee\n* [_Building a resilient RSS feed unifier with ZIO_](https://tech.interfluidity.com/2023/07/29/building-a-resilient-rss-feed-unifier-with-zio/index.html)\n* [_Taking control of podcasts via RSS_](https://tech.interfluidity.com/2023/09/17/taking-control-of-podcasts-via-rss/index.html)\n\n---\n\nLet me know what you think!\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswaldman%2Funify-rss","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswaldman%2Funify-rss","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswaldman%2Funify-rss/lists"}