Overhauled Feedly syncing to prevent the request floods that could get users temporarily banned - syncing pauses when Feedly reports rate limiting, fetches only what changed since the last sync, caps article downloads per refresh, and directly refreshes a few feeds each sync to backfill articles missing from Feedly's aggregate stream
Fixed the Feedly mark-as-read backlog that could grow forever and re-send the same statuses - sent statuses are recorded as they succeed, and statuses Feedly can no longer accept (articles past its 31-day marker limit) are dropped
Used the published dates Feedly reports for articles, so a newly added feed's archive is no longer dated all today
Fixed Feedly folder and feed bugs - renaming a folder during a refresh could delete it, restoring a deleted folder restored nothing, a failed move could leave a feed in two folders, same-named folders collapsed into one, and right-to-left and untitled feed names were rewritten every sync
Made Feedly sign-in and token refresh more robust - canceling on the consent page no longer shows an error, expired tokens refresh reliably, and removing the account always removes its tokens from the Keychain
Fixed bug where a Feedly feed the server no longer knows about could never be deleted
Paused Reader API syncing when the server reports too many requests, honoring its retry time - and Inoreader additionally conserves its API quota by skipping status downloads when near its daily limit
Sent queued article statuses for Inoreader on every status sync, so read and starred changes no longer wait out the quota throttle
Fixed folder creation for Reader API accounts (FreshRSS, BazQux, The Old Reader) - new folders no longer disappear before a feed makes them real on the server
Fixed Reader API article ID encoding that could make article downloads fail
Used conditional GET for Reader API tag and subscription lists
Posted real errors to the Error Log from Reader API status syncing, and kept an unread fetch failure from skipping the starred fetch
Fixed NewsBlur folder syncing aborting on a missing folder, applied server-side feed updates, and preserved locally edited feed names
Checked iCloud account status before syncing - feeds still refresh, without repeated error alerts, while iCloud is unavailable (such as when new Terms and Conditions need accepting, which now shows a clear message), and syncing resumes automatically when iCloud comes back
Fixed bug where an iCloud feed moved between folders could disappear until the destination folder synced
Fixed iCloud sync progress leaks that left refresh wrongly showing as in progress
Fixed bugs in Feedbin, Feedly, NewsBlur, and Reader API accounts where a status refresh could briefly revert just-made read and starred changes
Fixed bug where sending an article's read status could delete its queued starred status
Made statuses queued when the app was killed get sent at next launch
Repaired a feed's stored ID when a sync service reports a different authoritative one
Allowed accounts with the same username on different servers
Showed the account name and type in sync error messages, and stopped showing sync decoding errors as theme import errors
Fixed feed discovery bugs caused by slashes in unquoted HTML attribute values
Supported Atom xml:base for resolving relative URLs
Preserved custom feed titles from imported OPML across refreshes
Added a feed-finding special case for relay.fm/blog
Extracted the article body from feeds that put a full HTML page in an article
Used a browser user-agent string for image and theme downloads
Removed punctuation and symbols when indexing search text, so words in curly quotes (for instance) are findable
Updated smart feed unread counts on app activation and at the day change
Added a special case for blog.naver.com to Reader View
Preserved the aspect ratio of fixed-size iframes when the article width shrinks them
Hid Mailchimp newsletter social icon walls and social-share icon blocks whose unsized SVG icons rendered at full width
Sized inline SVG icons that depend on stripped stylesheets - Tailwind classes and Material for MkDocs markup
Zeroed negative side margins on tables so they stay inside the article
Kept absolutely positioned feed content from escaping the article body and overlapping the title
Fixed text selection in a footnote within a footnote
Fixed mailto links that were already percent-encoded showing a literal %20 in the subject line
Fixed Handoff showing "No selection" after the source device was locked
Handed off the web page instead of the article while the in-app browser is open
Made tapping an image that's a link open the link instead of zooming the image - tapping a plain image still zooms it, and tapping the feed icon opens Feed Info
Fixed blank screen after dismissing a full-screen image
Fixed bug where a slow image download could open the image viewer after you'd left the article
Stopped taps on an embedded video's controls from opening the video URL in a browser
Fixed bugs where articles could open scrolled to the middle instead of the top - reader view articles, and articles opened via Handoff or deep links
Recovered from WebKit content-process termination, so articles no longer come up blank after the system reclaims the web views
Fixed article layout issues caused by running the layout script twice
Fixed bug where the timeline could briefly show large titles in the navigation bar
Kept the current article when adding a feed - showing the Add Feed sheet no longer clears the selection
Fixed bug where opening the app from a notification could fight with state restoration at launch
Scrolled the selected timeline item fully into view when it was only partially visible
Made tapping the already-selected feed navigate to it again
Made go-to-feed work when the feed is filtered out of the feeds list
Fixed arrow-key navigation between panels in two-panel and collapsed layouts
Saved and restored the timeline width between runs on iPad
Made the l key respect the setting for confirming mark-all-read
Added a Clean Up keyboard shortcut
Fixed the Mark All as Read confirmation appearing centered when triggered by keyboard shortcut
Made dragging a feed from account to account a copy rather than a move, matching the Mac version
Replaced the legacy Add Feed Siri intent with an App Intent so it appears in Shortcuts again
Shared the article URL as the primary share-sheet item so Shortcuts receives input
Replaced the share extension's form with a custom form
Made VoiceOver announce the article-view feed icon as a Get Feed Info button