An open source client-side algorithmically-driven RSS reader... Show More
An open source client-side algorithmically-driven RSS reader built at the Suffolk LIT Lab. Use 👍 & 👎 + Seen or Open to feed the algo. Refresh this page to update card order.
By default, searches, votes, & settings don't leave your device, and no login is required. Customize your algo and timeline in Settings. Curate sources in Feeds. Add feeds with the blue plus button. For project updates, visit our GitHub page.
Consider starting with one of our pre-made feed collections. You can select a pre-made feed in Feeds above, or just load the Fire Hose. Then, over time you can whittle it down and add new feeds as you like. To remove a feed from your collection, click 🚫 in a card's footer. To see other content from that feed before removing it, click on the feed's name in the footer.
You can customize most features in Settings. To change how many cards appear on your screen, how far back they're pulled from, and how likely you will be to like what you see, just move a slider.
Show Less
⚠️ There was an error reading the following feeds:
This message will refresh after your next full-download session (i.e., after your coooldown clock resets). If this issue persists, these feeds may have moved or no longer work with this reader. You can remove a feed by clicking on remove above.
Be patient. Use search cards above to see if you've downloaded any articles from a feed recently. Some sites (esp. smaller ones) may only be accessable off and on. Don't give up too easily.
You can manage your feeds by clicking Feeds at the top of this page. See additional controls below. To determine what articles you like, we make use of insights from TF-IDF, comparing all the text from the cards you vote up or down with everything you've "seen." I hope to write a more complete explanation sometime. When I do, I'll put a link here. Until then, you can always look at the code.
Note: when figuring out what you "like" we look only at the card's domain, title, description, and the RSS Feed's name. We don't look at the content of the article. We convert all feed names into hypenated words. That's why you might see things like nyt-top-stories (NYT > Top Stories) in the word lists below. Also, we do something similar for an article's domain (e.g. nytimes-com).
There's no need to download every feed every time you hit refresh. So this site waits a defined period before downloading content. If you refresh the page before the end of this cooldown period, it will recalculate ratings based on recent votes and filter what it displays based on the other options here, but it won't try to download your feeds. Welcome to the finite scroll. Currently the cooldown period is set to 0.25 hours. You can change this below, but you must refresh the page to see results.
If you set a cooldown period that is shorter than the current value, you will have to wait for the old period to pass before the new one takes effect. So, once you set it and refresh, there's no quickly going back.
You don't need an account, nor do you need to provide any personally identifying information, to use The Finite Scroll. By default, any searches or votes you make are stored only in your browser as part of localstorage. The same is true for any other persistent data (e.g., your filters and the choices you make below). Presumably GitHub (which hosts this site) keeps some log files. When fetching your feeds we make use of a couple of proxy servers. First we use our own, then as fallbacks: corsproxy.io and cors.lol respectivly. FWIW, corsproxy claims not to keep log files. The publishers of these feeds, however, only see the IP addresses of the proxy servers when they are downloaded.
We embed preview images and a site's favicon as part of most article cards. So, unless you have the "Images: Exclude preview images and favicons..." option checked below, simply loading your timeline will download those files, likely producing log files on the servers they came from. And of course, if you follow a link to an article, you'll access that article and set in motion all that comes with that.
If you make it through all of your articles, and it's Monday, we may embed a small crossword puzzle as a reward. This will load content from crosshare.org, an open-source ad-free crossword site. You can, however, turn this off below.
If you check the "Show local weather" option below, your browser will share your location with Open-Meteo's weather API. Similarly, if you add an API Key under Magical AI Fairy Dust, when you click 🤖, the headlines and introductory sentences of your feeds may be shared with your LLM provider depending on your prompt. You can, however, use a local LLM and avoid sharing your prompt with anyone.
Importantly, if you turn on the Cloud Sync feature, all of your stored data will be shared to a GitHub Gist you control.
The options you choose here will effect this site's performance. Generally speaking, the more you ask the site to do (e.g., show a lot of cards) the slower it will load, reorder, and the like. Of course, the number of feeds you follow will also influence this. The trick is finding the right balance for you and your device.
Display content from the last 7 days. Refresh page to see results.
You can limit how much you see in your timeline by adjusting the slider above. If you clear your reading history, however, it will remove older articles, not just hide them. This will effect your recommendations since they are based on your interactions with old articles (did you vote them up or down). Refresh page to see results.
In addition to the ratings cutoff below, you can set a limit on the maximum number of cards visible at one time. If there are more unread cards than can fit on the screen, they will show following the page refresh after you've cleared space for them. Consider also, that each refresh triggers a recalculation of the card rankings based on your interactions. So, a selection with more screens (fewer cards) will be more "responsive," and take less time to chug through calculations. Max Cards: 200. Refresh page to see results.
When calculating ratings, how much influence should down votes have compared to up votes? If you choose 0, they don't count at all. If you choose 1, they count equally. If you choose 2, they'll count twice as much as up votes. Why not just set this to 1? Well, people don't seem to respond equally to positive and negative experience. See negativity bias. Current value: 1.25. Refresh page to see results.
After the recommendations kick in, each of your cards is given a rating which is used to order the above list. We also truncate the list based on the following cutoff value. We use the z-score of the rating. The z-score of a value is just the number of standard deviations it is away from the mean (average). So the average score of your cards is always 0. Negative numbers are below average, and positive numbers are above average. Z-Score for cutoff: -2. Refresh page to see results.
You can use regular expressions to be confident you don't miss, or alternatively, never see, certain articles. Your input below will be fed into JavaScript's RegExp() as a constructor, where the first input is a string and the second is an optional operator. These are fed to .match(). If you include a regex under Bump Up, any matches to said expression will have 2 added to their score, which normally maxes out at 1, putting them at the top of your feed. Matches to the regex under Mute, however, will be hidden from your timeline. The match is performed against an article's: (1) title; (2) description; (3) feed name; and (3) link. Note: using the search feature overides these settings as it searches ALL articles. Leave string inputs blank to take no action.
Cards that have been bumpped up will include a ⇧ in their footer. Refresh page to see results.
Like Barbie and Openhimer news? Try: barbie|oppenheimer, i. See bumpped up content
Dislike Barbie and Openhimer news? Try: barbie|oppenheimer, i. See muted content
Mutes override Bumps. To be sure you aren't muting too many bumps, you can view their overlap. You can think of this like a spam folder of sorts, worth checking every once and a while.
To draw attention to content using a regular expression without bumping or muting, add a RegEx below. If an article's (1) title; (2) description; (3) feed name; or (3) link matches this RegEx, a flag will be placed before its title.
You can click on the RegEx1 (🚩) or RegEx2 (🏁) flag to run a search for either collection.
RegEx to add 🚩
RegEx to add 🏁
This feature adds a button to the upper-right corner of each card that opens a new window based on the URL you construct below. Use it to pass the card's {{url}} and/or {{title}} as parameters to some other url. Here are some example use cases:
https://www.reddit.com/submit?url={{url}}&title={{title}} (assumes you're logged in)https://bsky.app/intent/compose?text={{title}}. See {{url}} (assumes you're logged in)https://www.linkedin.com/feed/?shareActive=true&shareUrl={{url}} (assumes you're logged in)https://www.instapaper.com/api/add?username=USERNAME&password=PASSWORD&url={{url}}&title={{title}} (you'll need to edit USERNAME and PASSWORD)†https://pinboard.in/add?url={{url}}&title={{title}} (assumes you're logged in)https://archive.ph/submit/?url={{url}}https://web.archive.org/save/{{url}}Construct your URL here:
Refresh page to see results.
This feature predates Pass URL to Pop-up which can be used to recreate its functionality. It remains here to maintain backwards compatability.
Add your server below to enable a share to mastodon button for each article card. Since users of Mastodon use different servers/instances, we need to collect that information to enable sharing (i.e., so we can queue your post on the right server). If you'd like to use this feature, enter your server here (e.g. "mastodon.social"):
You can hide/group articles that are "too" similar to each other. To measure similarity we use vectorizations of cards based on TF-IDF. Leave the cosine similarity cutoff at 1 to keep all articles. Setting the cutoff to something lower will hide all but one of the acticles with similarity greater than the cutoff. This will display a list of "hidden" articles at the bottom of the top-most rated article card for that group. Note: this will slow down sorting of your articles, esp. for larger timelines. Also, all items in a group other than the top-most are marked as "read" to hide them from your timeline. This cannot be undone! Cosine Similarity for cutoff: 1. Refresh page to see results.
Because everyone else is doing it, you now have the option to add AI. 😜 To learn more, like why this is even here, read this blog post. Depending on your prompt below, this feature may share feed data with your LLM provider when 🤖 is clicked. You can, however, use a local LLM and avoid sharing your prompt with anyone.
API Base
API Key†
Your prompt
{{news-feed}} will be repaced by your headlines and introductory sentences.
Refresh page to see results.
You can save the data stored in your browser to a file. This is helpful for backups and if you want to move your history et al. between devices or readers.
If you click Save All it will include all of your votes and reading history. Save OPLM exports only your feeds. The OPLM standard can also be used to move your feeds to another RSS Reader.
Open can read both our full saved data files (.json) and standard OPLM files (.oplm). So, you can use it to load a file you saved above or a copy of feeds from another reader.
If you want to use The Finite Scroll across devices or browsers, you'll need an online copy of your articles, settings, and interactions. If you choose, you can create a Gist on GitHub to hold this data (Gists can't be empty. So make a file called the_finite_scroll.json with the body {}). Create a fine-grained access token under Account with permissions only to access Gists. If you provide this token and the Gist's name below, this data will turn on Cloud Sync. This will sync your data with the Gist every time you use the ☁️↺ feature.
ACTIVATING THIS FEATURE MEANS YOUR DATA WILL LEAVE YOUR DEVICE.
To use your saved Gist on a new device, enter this data there, and Push or Pull as appropriate to avoid overwriting the data you want to keep. After this first sync, clicking ☁️↺ will make sure you're using the most recent version of your data. This feature is experimental. If you're at all worried about overwriting your data, save a backup before entering this data.
Gist ID (i.e., https://gist.github.com/USER/GIST_ID)
Access Token†
If you want to overwrite all of your data with the current site defaults, hit the big red RESET ALL button.
Here are your most-positive words and their approximate TF-IDF, treating all up-voted cards as a single document: not enough data
Here are your most-negative words and their approximate TF-IDF, treating all down-voted cards as a single document: not enough data
†If you save your data to a file or enable Cloud Sync, all of your data (including any passwords or tokens) will be stored in plain text as part of your data file/Gist. Think very carfully about this and who might have access to these, and remember that even if you don't save or enable Cloud Sync, your data always lives in your browser's localstorage as plain text.
Image credits:
2017-fr.wp-blue-externallinks.svg (appears when using Pass URL to Pop-up);
No-Image-Placeholder.svg (appears when using no preview image is found)