{"id":15572975,"url":"https://github.com/themightygit/rssole","last_synced_at":"2025-05-07T15:22:14.510Z","repository":{"id":182366754,"uuid":"665320641","full_name":"TheMightyGit/rssole","owner":"TheMightyGit","description":"A no-frills RSS Reader inspired by the late Google Reader","archived":false,"fork":false,"pushed_at":"2024-11-12T10:52:52.000Z","size":575,"stargazers_count":62,"open_issues_count":11,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-05T06:49:36.247Z","etag":null,"topics":["bootstrap","bootstrap5","go","golang","htmx","rss","rss-reader"],"latest_commit_sha":null,"homepage":"","language":"Go","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/TheMightyGit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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}},"created_at":"2023-07-12T00:34:08.000Z","updated_at":"2025-04-15T15:48:02.000Z","dependencies_parsed_at":"2023-07-19T18:42:05.144Z","dependency_job_id":"077232c2-68f7-4eb6-8406-983bbb79ffcd","html_url":"https://github.com/TheMightyGit/rssole","commit_stats":{"total_commits":154,"total_committers":3,"mean_commits":"51.333333333333336","dds":0.01948051948051943,"last_synced_commit":"a24fffb8e149b3230e54173ada2b074c4dfa1a3a"},"previous_names":["themightygit/rssole"],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheMightyGit%2Frssole","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheMightyGit%2Frssole/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheMightyGit%2Frssole/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheMightyGit%2Frssole/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TheMightyGit","download_url":"https://codeload.github.com/TheMightyGit/rssole/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252902859,"owners_count":21822324,"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","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":["bootstrap","bootstrap5","go","golang","htmx","rss","rss-reader"],"created_at":"2024-10-02T18:09:08.796Z","updated_at":"2025-05-07T15:22:14.489Z","avatar_url":"https://github.com/TheMightyGit.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![badge](./badge.svg) ![workflow status](https://github.com/TheMightyGit/rssole/actions/workflows/build.yml/badge.svg) [![Go Report Card](https://goreportcard.com/badge/github.com/TheMightyGit/rssole)](https://goreportcard.com/report/github.com/TheMightyGit/rssole)\n\n# rssole\n\nAn absolutely no frills RSS Reader inspired by the late Google Reader. Runs on\nyour local machine or local network serving your RSS feeds via a clean\nresponsive web interface.\n\n![Screenshot 2023-08-10 at 14 21 53](https://github.com/TheMightyGit/rssole/assets/888751/a44ae604-72a4-4e92-8ed7-5580663eaf0c)\n\nA single executable with a single config file that can largely be configured\nwithin the web UI.\n\nIts greatest feature is the lack of excess features. It tries to do a simple\njob well and not get in the way.\n\n## Background\n\nI really miss Google Reader, and I really like simplicity. So I made this\nnon-SaaS ode to Google Reader so I can triage my incoming information in one\nplace with one interface in a way I like. At heart this is a very self serving\nproject solely based around my needs, and because of that it's something I use\nconstantly. Hopefully it's of use to some other people, or you can build upon\nit (MIT license, do what you want to it - make it comfortable for you).\n\n## Advantages/Limitations\n\nI see these as advantages (so they are unlikely to be added as features), but\nsome may see them as limitations...\n\n- Only shows what's in the feed currently, does not store stories beyond their\n  lifetime in the feed.\n- Doesn't try to fetch anything from the linked page, only shows info present\n  in the feed. The aim is not to keep you inside the RRS reader, if you want\n  more then follow the link to the origin site.\n- No bookmarks/favourites - you can already do this in the browser.\n- It's not multi-user, there is no login or security protection. It's not\n  intended as a SaaS product, it's just for you on your local machine or\n  network. But you can stick an authenticating HTTP proxy in front of it if you\n  wish.\n\n## Pre-Built Binaries and Packages\n\nCheck out the [Releases](https://github.com/TheMightyGit/rssole/releases/)\nsection in github, there should be a good selection of pre-built binaries\nand packages for various platforms.\n\n## Installing via Brew\n\n```console\n$ brew install themightygit/rssole/rssole\n```\n\n## Installing via Go\n\nYou can install the binary with go install:\n\n```console\n$ go install github.com/TheMightyGit/rssole/cmd/rssole@latest\n```\n\n## Building\n\nNOTE: You can ignore the `Makefile`, that's really just a helper for me during\ndevelopment.\n\nTo build for your local architecture/OS...\n\n```console\n$ go build ./cmd/...\n```\n\nIt should also cross build for all the usual golang targets fine as well (as no\nCGO is used)...\n\n```console\n$ GOOS=linux GOARCH=amd64 go build ./cmd/...\n$ GOOS=linux GOARCH=arm64 go build ./cmd/...\n$ GOOS=darwin GOARCH=amd64 go build ./cmd/...\n$ GOOS=darwin GOARCH=arm64 go build ./cmd/...\n$ GOOS=windows GOARCH=amd64 go build ./cmd/...\n$ GOOS=windows GOARCH=arm64 go build ./cmd/...\n```\n\n...but I only regularly test on `darwin/amd64` and `linux/amd64`.\nI've seen it run on `windows/amd64`, but it's not something I try regularly.\n\n### Smallest Binary\n\nGo binaries can be a tad chunky, so if you're really space constrained then...\n\n```console\n$ go build -ldflags \"-s -w\" ./cmd/...\n$ upx rssole\n```\n\n## Running\n\n### Command Line\n\nIf you built locally then it should be in the current directory:\n\n```console\n$ ./rssole\n```\n\nIf you used `go install` or brew then it should be on your path already:\n\n```console\n$ rssole\n```\n\n### GUI\n\nDouble click on the file, I guess.\n\nIf your system has restrictions on which binaries it will run then try\ncompiling locally instead of using the pre-built binaries.\n\n## Now read your feeds with your browser\n\nNow open your browser on `\u003chostname/ip\u003e:8090` e.g. http://localhost:8090\n\n## Network Options\n\nBy default it binds to `0.0.0.0:8090`, so it will be available on all network\nadaptors on your host. You can change this in the `rssole.json` config file.\n\nI run rssole within a private network so this is good enough for me so that I\ncan run it once but access it from all my devices. If you run this on an alien\nnetwork then someone else can mess with the UI (there's no protection at all on\nit) - change the `listen` value in `rssole.json` to `127.0.0.1:8090` if you\nonly want it to serve locally.\n\nIf you want to protect rssole behind a username and password or encryption\n(because you want rssole wide open on the net so you can use it from anywhere)\nthen you'll need a web proxy that can be configured to sit in front of it to\nprovide that protection. I'm highly unlikely to add username/password or\nencryption directly to rssole as I don't need it. Maybe someone will create a\ndocker image that autoconfigures all of that... maybe that someone is you?\n\n## Config\n\n### Arguments\n\n```console\n$ ./rssole -h\nUsage of ./rssole:\n  -c string\n        config filename (default \"rssole.json\")\n  -r string\n        readcache location (default \"rssole_readcache.json\")\n```\n\n### `rssole.json`\n\nThere are two types of feed definition...\n\n- Regular RSS URLs.\n- Scrape from website (for those pesky sites that have no RSS feed).\n  - Scraping uses css selectors and is not well documented yet.\n\nUse `category` to group similar feeds together.\n\n```json\n{\n  \"config\": {\n    \"listen\": \"0.0.0.0:8090\",\n    \"update_seconds\": 300\n  },\n  \"feeds\": [\n    {\"url\":\"https://github.com/TheMightyGit/rssole/releases.atom\", \"category\":\"Github Releases\"},\n    {\"url\":\"https://news.ycombinator.com/rss\", \"category\":\"Nerd\"},\n    {\"url\":\"http://feeds.bbci.co.uk/news/rss.xml\", \"category\":\"News\"},\n    {\n      \"url\":\"https://www.pcgamer.com/uk/news/\", \"category\":\"Games\",\n      \"name\":\"PCGamer News\",\n      \"scrape\": {\n        \"urls\": [\n          \"https://www.pcgamer.com/uk/news/\",\n          \"https://www.pcgamer.com/uk/news/page/2/\",\n          \"https://www.pcgamer.com/uk/news/page/3/\"\n        ],\n        \"item\": \".listingResult\",\n        \"title\": \".article-name\",\n        \"link\": \".article-link\"\n      }\n    }\n  ]\n}\n```\n\n## Key Dependencies\n\nI haven't had to implement anything actually difficult, I just do a bit of\nplumbing. All the difficult stuff has been done for me by these projects...\n\n- github.com/mmcdole/gofeed - for reading all sorts of RSS formats.\n- github.com/andybalholm/cascadia - for css selectors during website scrapes.\n- github.com/JohannesKaufmann/html-to-markdown/v2 to convert HTML into Markdown\n  (thus sanitizing and simplifying it).\n- github.com/gomarkdown/markdown to render content markdown back to HTML.\n- github.com/k3a/html2text - for making a plain text summary of html.\n- HTMX - for the javascript anti-framework (and a backend engineers delight).\n- Bootstrap 5 - for HTML niceness simply because I know it slightly better than\n  the alternatives.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthemightygit%2Frssole","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthemightygit%2Frssole","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthemightygit%2Frssole/lists"}