App now uses the article’s date for notification timestamps
Improves app responsiveness and reduces disk I/O usage.
Improved networking stack
Changed Preferences menu title to Settings on macOS 13.x
Marking articles read/unread is now a local operation, i.e. if the Cloud request fails for any reason, the information is persisted and will be synced with the Cloud API once your device or the service is reachable across the interwebs.
Assortment of fixes from various crash reports
Fixed rendering and scrolling slowness on macOS 13.x
Ongoing fixes for filtering articles
Fixed feed title not being fully visible upon scrolling
Fixed custom feed title not being used (macOS only)
Fixed stuttering when image loads and scrolling in the article reader.
I recently switched to using macOS Ventura on my MacBook M1 Pro as the primary working device.
This required a change in my workflow and given how these machines work, Elytra would always be up to date and ready with new articles when I opened the lid the morning.
I quickly began noticing abysmal scorlling performance in the article view of the app. On a second passs, I noticed everything about the article view was slow: rendering, scrolling, and resizing.
I ran the AppStore build on my macOS 12 system and did not observe the same, but this Mac had 64GB of memory, a dedicated desktop-class GPU and a 14-core workstation chip, all liquid cooled. So I began to wonder if the M1 Pro chip was being “lazy”.
I still wondered if I am to blame for this, I turned to instruments to analyze the rendering performance and behold: TextKit2 bites me again.
Now that I know what’s causing the issue, I turned to the internet: Apple’s Dev Forums, StackOverflow, various macOS engineering blogs and even mailing lists (those are still very very cool).
It turns out, I’m not the only one to be bit by TextKit 2’s erractic behaviour, incomplete APIs and a lack sensible documentation apart from a few WWDC videos. To make matters worse, unlike TextKit 1, this was no “drop-in” replacement like Apple claimed it to be and is an automatic opt-in when compiling with the latest SDKs.
In a sample project, TextKit2 rendering was atleast 70% slower than TextKit1. Worse, when resizing a window.
Luckily for me, I found this post by Daniel Jalkut
The simple workaround, for the time being anyway, is to force your text view to use TextKit 1. As explained in the WWDC excerpt above, this is as simple as asking it once for its layout manager, which will cause it to rebuild its entire text architecture to suit the TextKit 1 way of functioning
and the oneliner: let _ = myTextView.layoutManager
Because of how Elytra is archictected, this patch totaled in as a +1 -0 commit. Sweet. All text-rendering is mostly handled by a single View: Paragraph which other views like Heading, List, Blockquote, etc. are subclasses of.
With that fix in place, the article view was back to rendering, scrolling, and resizing at full 120Hz (sweet sweet ProMotion goodness).
This will become available as a fix in the upcoming builds v2022.11.3 (485) which are currently waiting for review.
If you’re using the notarized releases, the latest build is immediately available for download:
If you’re also building and shipping a Catalyst app, and wondering if you’re app also may be affected by this issue: unless you are intentionally poking at the layout managers, containers of the text views, you shouldn’t have to worry. But if you are and notice similar issues, try forcing the text view to use TextKit 1 instead and see how that works out.
Fixed a bug with updating counters after syncing completes
Fixed a bug with the “Review App” prompt appearing unexpectedly
Fixed a bug causing filtered articles to be visible in article lists throughout the app.
Fixed crash when opening an article from notifications.
Improvements for find in article on iOS 15
Find in article now loops over results in iOS 15 similar to iOS 16
Fixed search results in articles appearing in reverse order on iOS 16
Fixed a bug with counting for the lockscreen widgets
This will be the last release of 2022, not including bug fix releases in the v2022.11.x pipeline if any are required. I’ll be starting work on the next big features of Elytra soon and will slowly start becoming available with the v2023.1 release.
In the mean time, I hope you stay safe and healthy. Happy holidays.
The first release of March, 2022 is here and includes a variety of improvements and bug fixes.
The is the first release to introduce Neptune, Elytra’s own full-text extractor based on modern technologies.
If you feel generous and have a couple of minutes, please leave a review on the App Store. It makes a huge difference for me. Thank you in advance.
Here’s what’s new and changed in v2022.03.0:
The app now uses Neptune, a new full-text extractor, for fetching full-text content for articles.
[macOS] Added Read and Bookmark buttons to the toolbar.
You can now import and export your feed settings.
Fixed articles rendering an image caption again as a normal paragraph.
Fixed an accessibility bug where large bodies of text would not be picked up by VoiceOver.
Fixed an accessibility bug where image captions would sometimes skip punctuations when using VoiceOver.
Fixed a crash that would sometimes occur when opening an article in its own window.
Fixed fetching full-text and reloading full-text content.
Fixed discarding loaded full-text content.
Fixed a critical issue where the app would start into an invalid state after setting up the account.
Fixed a crash which would sometimes occur when opening an article in the browser.
Fixed a crash which would sometimes occur when setting up an article.
If you see continous errors when fetching information about subscriptions, purchasing or restoring: please check if you have a custom DNS blocker enabled on your device. Some of these prevent connections to the service Elytra now uses to manage subscriptions. You may have to unblock api.revenuecat.com in your DNS blocker settings to get things to work.
Elytra got multiple releases in February. This post outlines the changes across all those releases and acts as a monthly summary of things happening here.
Starting with the recent releases, the versioning scheme for the apps has changed. The previous version numbers wouldn’t make much sense to either of us, except for identifying a particular release.
That’s not helpful if I have tens of builds for the same version and the macOS and iOS apps are running two separate builds for the same version.
Now, the versions are numbered as year.month.release, the latest release being 2022.02.4. That makes it easy for the both of us to identify when this build was released. For people browsing the App Store, it’s a clear indication of a regularly updated app as well.
Changes, Improvements and Fixes
Added new keyboard shortcut to load Full-Text when an article is open.
Updated Japanese translations
Improvements to bulk marking read and improvements around on-device logging for the same.
Hint for externally opening articles
Some fixes around images from specific hosts failing to load.
Fixed some issues around fetching full-text.
Fixed a bug causing full-text cover images not being drawn in the article view.
Fixed an issue with some attachments not appearing in articles.
[iOS] Added Logs viewer and export under settings.
Fixed swipe action on article not correctly marking an article as unread.
Clear local data correctly when resyncing.
Fixed shadows of the categories in the New Feed section.
Fixed a crash when processing block quotes in some articles.
Fixed a crash occurring after a successful OPML import.
Fixed crashes around importing feeds from OPML files.
Fixed feeds not mapping to folders when importing structured OPML files.
Fixed a bug with first time account setup causing multiple not-found errors in some cases.
Fixed a crash when syncing new articles which only contain a cover image.
Fixed adding a new feed directly to a folder.
Fixed feeds resync discarding feed settings.
Fixed feeds resync not remembering custom feed names.
Fixed shadows of the categories in the New Feed section.
I’m going to make this a habit: post a monthly summary at the beginning of each month so changes to app can be clearly tracked and if we missed out anything, we can go back and look at these logs to figure things out.
There are a few new repos I’d like to mention here:
Localisations All the translation files used by Elytra. If you find a mistake in a translation, please feel free to submit a correction there. You can also add a new language that you’re comfortable translating to. The contents of that repo use a permissive license, so other developers can also use translations that fit their apps from there.
IssueTracker The Issue Tracker is a public repo for tracking bugs and feature requests. If you have one, please open an issue there with the correct type so other users with similar requests can also chime in.
Thank you for reading, have a safe and cheerful day.
Elytra is now optimised and available for macOS Monterey. It also includes performance and usability optimisations for macOS Big Sur. You can download it directly from here or from the App Store.
This is the first release with a modern and cutting-edge foundation which focuses on reliability, stability and ease of adding new features in future releases.
If you feel generous and have a couple of minutes, please leave a review on the App Store. It makes a huge difference for me. Thank you in advance.
Along with the macOS release, a small iOS release is also available which brings the most recent fixes to the iOS app and brings the two on parity.
New UI for the New & Rename Folder prompt
Improved UI for Feed Info UI
Safari Extension to add new feeds to Elytra directly from the webpage you’re browsing.
Quick Notes support (only on macOS Monterey)
Added a new sync method to also sync added and deleted feeds on sync
Added a new Portrait Lock preference under miscellaneous settings
Added support for tables in articles
New and improved article list view. It renders twice as fast now and uses less power overall
Added a new setting to the Feed Settings: You can now toggle full-text fetching for feeds. When you open an article from that feed, the full-text content will be automatically loaded.
Added a “Enable Push Notifications” toggle under Preferences > General. You will only see it if Push Notifications are not already enabled on that device. For cross-device sync, it is recommended you turn this on.
New Options for Feeds: Open Articles in the Browser. This is useful for feeds where full-text extraction fails.
Improved loading speed for the Unread and Today feeds.
The panel sizes (Sidebar and Articles List) are now persisted across app launches.
New Photos Browser
Improved handling of adding new feeds via the url scheme
If you add multiple folder widgets, you can configure each one with a unique folder (latest macOS only).
Improved error messages across the app. The app will now display error messages directly from the API’s error
Added delete and info swipe actions to the search results for feeds
Improved scrolling performance in the article reader
New Appearance customisation UI in the article reader
Improved visuals for the folder row if a feed is being dropped onto it
Improved dragging states for feeds and articles
The sidebar now maintains the folders expansion state across app launches
Added the cmd + G (cmd + shift + G for backwards) shortcut for navigating to the next article search result
Improved sync and timeline loading performance for users with several filters
Fixed an issue where changing the font-size from the Preferences window to any value other than System would keep system sizing enabled
Fixed an issue where closing the main window would prevent the window from being opened again
Fixed an issue which caused the macOS tint color to not be properly set for all views
Foxed an issue where the window’s size and position would not be maintained with window manager apps installed and running
Fixed an issue where marking some articles as read failed if they were recently synced on to the device
Fixed an issue across all platforms that could sometimes cause a crash on launch when available system memory is low
Fixed an issue with the title view in the articles list being hidden after scrolling
Fixed an issue when swiping back from the article reader when the bars are hidden to cause the layout to get janked
Fixed an issue with the new sync not updating the feed’s folder structure if one already exists
Fixed an issue that caused a crash when changing from light to dark mode and the article reader was open
Fixed a crash that would sometimes occur when opening an article with Lists containing multiple line breaks at the beginning of the paragraph
Fixed a bug with importing OPML Files with invalid/incorrect format
Fixed an issue where the feed settings would not be loaded correctly on app launch
Fixed an issue which caused Feeds only re-sync to fail which also caused background sync to fail sometimes. This could potentially cause feeds metadata to get wiped
Elytra v2.3 has just been released, you can read all about here.
I’m also excited to announce that Elytra is now also available on macOS as a Notarized app. You can head over here to download the latest release.
It’s same as the Mac App Store release with two distinct differences:
The app can auto-update itself (or you can manually check for updates) between the two Release and Test Build pipelines. The release line is recommended for most users, the test line is for those who like living on the edge.
The app will use an external Payment Processor which enables me to offer discounts, especially for students, you can read more about it here.
Going forward, I’ll be able to release more frequent fixes directly to the Notarized builds. These builds currently do not have any kind of crash reporter built-in. So if you encounter any crashing bugs, please do take a moment to send me the crash report.
I look forward to hearing from you about this, you can always reach out to me on twitter or email me at firstname.lastname@example.org. Happy Reading.
Elytra’s 2021 Summer Release is here, just in time for WWDC 2021. It’s been extra challenging to work on v2.3 as this is the first release of Elytra that introduced Swift into various core systems of the app.
If you have read my earlier post about the public beta, you’d know this has been in the works for a while, but the work on the new version started all the way back in February of 2020.
This is slightly bigger release (even I am not used to this) so this is going to need a TLDR.
New system for adding feeds: You can explore topics by prefixing your keyword with the # symbol. Or directly search for a website with its base URL.
Sync is now faster: more reliable and uses a delta updates approach to conserve power and network bandwidth.
Two new Widgets: Folders (configurable) and Bloccs.
Improved App Performance: Thanks to a new core, the app’s performance has seen a big boost and crashes less.
Filters on macOS: You can now add and remove filters directly from the macOS App.
Mini Audio player: Elytra now ships with a mini-audio player to quickly browse through audio-clips and podcast episodes.
Media Playback: Elytra now comes with improved support for Youtube and Apple Trailers feeds.
Search: Searching for feeds and articles is now simpler than ever and on macOS, it’s always available.
Reader Bar: You can now customise the reader bar size and choose from three sizes: Small, Regular and Large.
Finally: As always, an assortment of improvements and fixes.
Elytra v2.3 introduces a new system for finding and adding feeds to your lists. You can explore some pre-defined topics or search for topics of your interest by prefixing the keyword with a # key.
To directly explore feeds linked by a website, simply type in the website’s URL. If you have a feed URL, then you can directly use that.
Something that been asked for a long time is to directly add a feed to a folder when creating it. It’s now possible to do so and all your folders will be listed out. By default, None will be selected.
Syncing across all apps is now faster, more reliable and also automatically syncs in the background to keep all your devices in sync and ready to go. This lays a critical foundation for future releases.
The new sync system is written in Swift (version 5.4 for those who care) and is much more resilient, fault-tolerant and heavily tested compared to its previous iteration.
It also now uses a delta updates system so your devices only download the data they don’t already have. Multiple sync triggers can happen simultaneously on a single device of yours (say you added a feed, then marked all the items inside that feed as read which will trigger two events). This ensures your devices consume less power and consume less network bandwidth.
Two New Widget Types
v2.3 brings two new Widgets: Folders and Bloccs. The Bloccs widget brings up to 6 of the latest unread articles from your feeds to your device’s homescreen, decorated by the articles’ cover images. The Folders’ widget enables to you select a folder of your choice and showcase up to 4 articles from that folder. I can’t wait to see how you have these setup on your devices.
I’ve spent all of March working through various modules in the app to optimise the performance. The Article Reader was the only component in the app that was optimised down to the last bit (to my best knowledge and technical capabilities). Everything else was just mish-mash. You should now notice improved performance in the app for just about any activity you’d perform in it.
Filters on macOS
Filters have been available in Elytra since v1.0 so it was always weird that there was no UI for it on macOS. Now there is, it’s mac-assed and works exactly as you’d expect it to.
### New Subscriptions UI
I also took this opportunity to redesign the subscriptions interface. The new design is an indicator towards the next iteration of the design system for Elytra, it better and more clearly explains the advantages of each subscription type and enables you to quickly switch between the two offerings.
Mini Audio Player
For a long time, I’ve used Elytra to notify me when new episodes are available for the podcasts I follow. In v2.3, I’ve built a mini-audio player into the app. It detects Podcast episodes and automatically updates its rendering state. This is in no way a replacement to a full-fledged Podcast app, but just a little something to get you a sneak-peak into that episode if you so desire.
I’ve made several improvements to the API and the apps to improve media playback. This fixes some Youtube videos not loading correctly. But most importantly, the apps now load, and enable playback of Movie trailers from the trailers.apple.com RSS Feeds.
The apps now feature global search enabling you to search for Feeds and Articles. You can also match for author names. In a future release, tokens will also be introduced to tokenise your search for a more precise hunt.
If you’re looking up an article and there are no feed suggestions for the app to provide, the app will suggest feeds from the articles it has found. So you can jump to the feed or the article.
Reader Bar Sizes
To ensure the app is accessible by everyone, Elytra has always supported Dynamic Type, Voice Over and the various navigation accessibility features that macOS and iOS provides. In March, a customer got in touch with a complaint about the reader bar and a potential solution. We worked on that solution and I am now happy to let you know that the reader bar now comes in three sizes: Small, Regular (default) and Large. You can toggle the size from Settings > Misc.
PS: This setting has no effect if you’re using the toolbar.
Drastically improved performance and accuracy of batch marking articles as read. (In my testing, marking a batch of 2000 articles as read previously took over 8s, and now only takes 2s).
Counting unread articles is now literally 6 times faster. The app can now spend less time keeping these counters up to date and more time rendering articles.
Improved handling and logic for rotation on iPadOS. This also fixes the blank slate launch state of the app on iPads in portrait mode.
Sharing articles on macOS will now use the recommended approach instead of the workaround I was previously using. This will ensure a smoother experience across various macOS versions.
The macOS app will now correctly sync after waking up your mac from sleep.
Fixed a critical and long standing issue where articles marked as read on one of your devices would not sync to your other devices.
Fixed a critical bug where the “Start Trial” button would have no effect or start the process and keep the button disabled preventing retries.
Fixed an issue where opening a Feed or a Folder and then opening the Unread list would reset the sorting preference to Unread – Latest First.
Fixed an issue with sync not working correctly upon a fresh signup.
Fixed an issue where the wrong state for the article reader would be setup: incorrectly showing next and previous articles to be available when only a single article was available in that list.
Fixed an crashing bug on iPadOS where the app would crash after backgrounding the app.
Fixed a bug in which HTML would show in the summary field.
Fixed a bug with Substack newsletters where the images in the posts would be really small (Substack converts the original URLs into their image proxy URLs for the Feeds which caused this issue, Elytra strips out this information and then loads the images).
Fixed a bug where custom feed names would not correctly sync across to your other devices.
The macOS app will no longer open duplicate windows. If it finds an existing window for the same activity, it’ll bring that window to the foreground.
Externally connected displays on iPads will now mirror the the iPad screen. This would previously display the app’s UI at native resolution with no scaling. A future release will correctly address this issue.