Skip to content

v0.20.0

Choose a tag to compare

@jakublibik jakublibik released this 04 Oct 09:03
· 78 commits to master since this release

Upgrade notes

  • If you serve your own landing.html, point its sign-up links at {{ register_url }} instead of /register, as landing.example.html now does. Otherwise accounts that sign up from the landing are all recorded as coming from internal.
  • New option in Admin → Settings → Users: Pause feeds after N days without activity. It is off after the upgrade, so nothing changes until you set it. If you want the warning email to link back to your instance, set the new PUBLIC_URL in .env (for example https://readfine.example). Briefing emails use it too.
  • The upgrade rebuilds the search index so that Chinese, Japanese and Korean text can be searched. Measured at under two minutes for 170 000 articles. The index grows by about a fifth on an instance with many such articles and stays the same size without them.
  • Email addresses are now stored in lowercase. The upgrade converts existing ones, except where two accounts differ only in letter case (Alice@example.com and alice@example.com): those are left as they are and named in the upgrade log, and the one in mixed case can no longer log in until you merge or delete one of the pair.

Added

  • Saved searches. Save in the header of search results keeps the search, with its filters, under a name in the sidebar above Labels, with a count like the other entries. A saved search is not a snapshot: it runs again each time you open it, and it reads like a feed, marked read as you scroll, with Mark all as read covering only what it lists. Without a status of its own, it follows your unread setting. Edit reopens the search to update it, save it as a new one, rename it or delete it. A new account that lists its topics on the welcome screen starts with one, Top picks: the last week's articles scoring 60 or more, best first. In the API, GET /api/v1/saved-searches lists them and GET /api/v1/articles?view_id= returns what one lists.
  • Keyboard shortcuts in the reader: j/k for the next and previous article, o or Enter to open or close one, Space to read on into the next one, Shift+J/Shift+K for the next and previous entry in the sidebar, m read or unread, s star, e archive, t labels, v the original in a new tab, r to reload the list, Shift+A to mark the view read, g a and g s for All articles and Starred. ? lists them, and so does the help page. They follow Inoreader and Miniflux, and the TT-RSS keys n/p, u and s work as well.
  • The OPML export in Settings → OPML now takes along more of your setup: preferences beyond the timezone, relevance terms and your AI texts (interest profile, summary and context prompts), saved searches, catch-ups with their briefing schedules, and each feed's own settings such as full text and retention. Tick what goes in; with only Feeds & folders ticked you get plain OPML. On import, briefings arrive switched off, and a label that a filter, saved search or catch-up uses is created if you do not have it. AI keys and feed passwords are never exported.
  • The welcome screen for a new account has a second step: where your articles should come from. You can start with a few well-known English feeds on topics like technology, science, world news, food and sport, each topic in its own folder, import an OPML file, or add feeds yourself. Topics that match what you typed on the first step are checked for you. Self-hosters can offer their own list or turn it off, see "Starter feeds for new accounts" in the README.
  • What's new at the bottom of the user menu shows which version of Readfine the server runs and opens the release notes of that version, at /changelog. The page is public and linked in the footer of the landing, help and legal pages. Upgrade notes in it are shown to admins only.
  • Admins can pause fetching for accounts nobody uses: Pause feeds after N days without activity in Admin → Settings → Users (off by default, at least 30 days). A feed keeps being fetched while any of its readers is active, so a shared feed keeps going. With mail set up, a warning goes out 7 days before. A reader who comes back gets the feeds going again within about 15 minutes and a one-time note that articles may be missing. Admins, accounts with a briefing and accounts without feeds are never paused, and paused readers get no AI scoring or summaries. Admin → Users and Admin → Feeds mark such accounts and feeds as dormant.
  • With public page counting on, a new account keeps where it came from: the domain of the site that linked to the landing or registration page, a utm_source tag, invite, internal (another page of this site) or direct (no referrer). Admin → Traffic breaks down the accounts created by source under the registration funnel. Nothing else is stored, and switching counting off clears it from every account. The privacy page says so while counting is on.
  • In Settings → Relevance, the table of how your terms did now says "not counted yet" for a term whose words are too rare in the last month's articles to score, instead of "no match". Such a term may be misspelled, or new to your feeds: words from a feed added today are counted overnight.
  • With PUBLIC_URL set, the footer of a briefing email links to your instance and to Catch me up & Briefings, where the briefing is managed. The email sent when a briefing fails links there as well. Without it both stay as they were.

Changed

  • Opening an article that is still waiting for its full text now fetches it right away. Full text used to come only in queue order for the whole instance, about 20 articles a minute, so after a large import or new feeds the article you were reading could show only the feed's excerpt for a long time. An article whose earlier attempt failed keeps its retry schedule and its Retry button.
  • Adding a feed that someone else on the server already reads no longer gives you its whole stored history as unread, which could be hundreds of articles for a busy site. You get the last week unread, and always at least the newest ten, so a blog that posts once a month still shows its latest posts. Older articles are marked read, so you can still find them in the feed and in search, and they do not count as your reading anywhere. The unread ones now get a relevance score right away instead of the next night.
  • A score condition in a filter now reads like the one in the search: at least or below a number, with at least as the default. It compares the whole number the list shows, so at least 75 takes in every article shown as 75 or more. Existing conditions are converted (more than 74 becomes at least 75), so only an article right on the line can come out differently. Equals, which never matched a score, is left as it is with a note in the editor. In the API, score conditions take gte and lt; gt and equals still work.
  • Suggested terms in Settings → Relevance are more often about what you actually read. A word now ranks higher the more often it shows up in the articles you read compared with everything your feeds bring in. Common words like likely or humanity used to make the list just because they are frequent in longer articles.
  • The Mark all as read button in the sidebar only shows up on hover or long press where there is something unread. On a feed with nothing unread, the refresh button moves into its place.
  • A feed whose readers have all been deactivated by an admin is no longer fetched. It used to keep going as long as it had any subscriber.
  • Active on the admin dashboard's Users card now means accounts that read at least one article in the last 7 days (hover for the last 30). It used to count accounts that were not disabled. Admin → Users shows the same number next to the heading. It counts reading, not logins, and leaves out articles marked read by a filter or by duplicate detection.
  • The user table in Admin → Users shows more of how each account uses relevance. Terms counts a user's relevance terms, grayed out while they are still the list from signup or basic scoring is off. Scored 7d counts articles scored by AI in the last week, and Filters adds in brackets how many filters use a score. Hovering AI 7d breaks the number down by operation, and catch-up runs now count towards it. The Role column is gone; the admin gets a small badge next to their name instead.
  • Opening a link into Readfine while signed out, a bookmark or a link in an email, now takes you to that page once you sign in. It used to land on the article list. The warning before feeds are paused uses this to link straight to Settings → Profile, where the account can be deleted.
  • The user picker in Admin → Scoring eval lists only accounts with scored articles in the selected window, most first. Next to each name it shows how many were scored and how many of those engaged.

Fixed

  • Email addresses no longer depend on letter case. Someone who signed up as Alice@Example.com can log in as alice@example.com, and the same address can no longer register a second account by changing the capitals. Spaces around the address are ignored too.
  • Search finds Chinese, Japanese and Korean words inside running text. Search split text only at spaces and punctuation, so in these languages it took a whole sentence for one word, and a word inside it was never found. A word now matches wherever its characters stand together, in the title, summary or full text. A search for a single character looks at titles only.
  • The full text of some pages lost lines written as plain text blocks beside ordinary paragraphs. Bon Appétit recipes, for one, kept only the quantities of the ingredients (3, ¼, 5); now each ingredient reads as one line with its amount. Full text also comes out right on more sites: on some, Barron's among them, extraction used to return a print notice instead of the article, and on others a related-story promo ended up in the text. Articles fetched before the fix keep the text they have.
  • Article titles from some feeds, The Verge and other WordPress sites among them, showed HTML codes instead of characters, for example Can an ‘eSUV’ e-bike. Such titles are now stored as plain text, and titles already stored are fixed when you upgrade.
  • The sidebar and the article list load faster on a large instance. Opening a label, feed or folder with nothing unread left went through every article on the instance to find that out, and the counts next to Labels, Starred, Archived and Saved did much the same. Both now look only at your own articles. Switching to another view also no longer reloads the whole sidebar each time, only when it is more than a minute old.
  • On a phone, an article opened full screen (and one opened from Same story) has its ··· menu back, so you can generate a summary or context, mark it unread or fetch the full text there too. Star, archive and share are left out of it, since the bar at the top already has them.
  • A search with a score condition (for example, relevance at least 60) is much faster. It used to go through every article on the instance, not just yours, and on a large instance it took over a tenth of a second each time.
  • Search results sorted by relevance or score no longer skip articles further down while you read some of them with the status filter on Unread.
  • In Saved, an article scrolled up under the header at the top of the list is marked read as it goes out of sight. It used to count as read only once it had passed the header too, so one left under it stayed unread.
  • Articles that came in before a word of your relevance terms was counted (for example, from a feed added the same day) are scored again after the nightly recount. They used to keep a score of 0 until you saved your terms.
  • When two of your feeds carry the same article under the same link, the article list no longer counts the copy as another source covering the story. The copy was already marked read as a duplicate, but the row still said "1 other source". It is still listed under Same story at the foot of the article, marked same link.
  • Filters imported from an OPML export keep their order, which matters when one stops the rest. They all used to land at the same position and ran alphabetically. A filter that adds a label named with digits only, like 2024, no longer gets skipped on import, and a filter limited to feeds or folders you do not have comes in switched off instead of applying to every feed.
  • Last active in Admin → Users stays current for someone who reads in an installed app or a tab they leave open. It used to change only when the app was loaded or on login, so such a reader looked inactive, and after a month without a reload their automatic reading profile stopped being updated. Opening an article, reading by scrolling and changing an article over the API now count too.
  • The help, features and legal pages share one header: the Readfine name at the top leads to the home page, with Back to reader beside it when you are signed in. Help and features had nothing to take a signed-out visitor back, and the name on the legal pages led to the sign-in form.
  • When the verification email cannot be sent (the mail provider is down or over its daily limit), at sign-up or with Resend verification email, the page now says so and asks to try again in a few minutes. It used to say the email was sent, so a new account waited for a message that never came.
  • Checking a password no longer holds up everyone else on the instance. It is slow on purpose and used to block all other requests while it ran: thirty sign-ups at once froze the app for several seconds, and so, for a moment, did every password change, email change or account deletion.
  • On the registration page, Firefox and password managers no longer offer to fill your login into Display name. The email field is now marked as the account name.

Security

  • Signing in through the API (POST /api/v1/auth/token) now follows the same rules as the sign-in page. An account whose email is not verified gets no token, and failed attempts count toward the 15-minute lockout after repeated wrong passwords. The API used to skip both, so someone who signed up with another person's address could use the API before it was verified, and passwords could be guessed there past the lockout.
  • A password reset link stops working once an admin disables the account. A link mailed before that still let someone set a new password on the disabled account.
  • An invitation can only be used once even when two people sign up with it at the same moment. Both sign-ups used to go through.