Elytra Blog

The simple RSS Reader. This blog publishes release notes, engineering and design details.

Elytra Fall 2020 Update

Elytra’s Fall 2020 update is finally here alongside the release of iOS 14. This is v2.0 and will be the first build to only support iOS 14. If you’re still on iOS 13 and for whatever reason you won’t be updating to iOS 14 soon, rest assured, v1.8 will continue to function as long as you use it.

You can download the update from the App Store

Upcoming Devices

Elytra running on 4th Generation iPad Air

Apple will be releasing new hardware later in October starting with the recently announced new iPad Air 4th Generation devices. Elytra will be ready on day-1 when these devices reach you with no new updates required.

iOS 14 UI

Elytra running on the iPad Pro and on the iPhone 11 Pro showing new User Interface elements from iOS 14

Throughout the app, I’ve made changes to the app’s interface to closely follow new updates Apple has released this year, including menus from buttons (for the sorting option), new Sidebar Layout style on the iPad, Triple Column Layout on the iPad and new List styles.

New Code Theme

The new code theme in Elytra 2.0

Also in this release, I’ve included a new Code theme which uses the semantic colours from iOS, auto-updates for dark mode without reloading the entire stack and, may I say so myself, looks beautiful. You can read more about in this blog post I wrote earlier.

Widgets

How could an iOS 14 release build be complete without new Widgets! I’ve personally been looking forward to using Widgets and making them was fun too! Elytra 2.0 ships with 2 different widgets:

  • Counters Widget: Shows the latest counts of articles from Unread, Today and Bookmarks sections of the app. This widget is only available in the small size.

  • Unread: Shows the latest articles from the unread section. The medium size widget shows 2 articles and the large size widget will show 4 articles. This widget will prioritize articles with cover images.

Full Change Log

What’s New

  • All new triple column support using Apple’s own UI Framework.

  • An all new Sidebar Interface. This uses Apple’s latest UI Framework for displaying your folders and feeds.

  • iOS 14 Widgets support. Contains a Counters (Small) Widget and an Unread Articles (medium and large) widget.

  • Implements Trailing Swipe actions on Article List Items.

  • Directional marking as read. Long press on an article in Unread, Today or a Feed to see these options.

  • New Code Theme for pre-formatted code blocks.

  • The Add Feed interface now shows Recommendations for its default state to help improve finding and adding new feeds.

Improvements

  • Unread counts update more reliably as you read through your content.

  • Improved underlying code for managing the initial state of the app.

  • Force touch and tapping on urls now works reliably.

  • Updated Feed Sorting options to use a menu interface instead of an options controller.

  • Improved styling for inline code blocks.

  • New Folder/Edit Folder interface now uses a basic interface which is faster to use IMO.

Fixes

  • Prevents an issue causing the app to sync data twice upon successfully launching.

  • Fixes an issue where marking currently loaded articles as read in the Unread view would prevent new articles from loading.

  • If you have setup a custom title for a Feed, the custom title will now show up correctly for the empty state.

  • Fixed a crash caused when trying to share a Feed’s URL or its website’s URL.

  • Fixed an issue where reading an article from today would not decrement the “Unread Today” counter.

  • Fixes showing cover images inside the Article Reader.

  • Fixed I/O View not appearing when importing / exporting OPML files.

  • Fixed some pre-formatted quotes appearing as single-line code blocks.

  • Fixed code blocks appearing out of order. A year old bug finally fixed!

This update also includes miscellaneous improvements and fixes under the hood to improve the general stability of the app.

As recently put by one of Elytra’s admirers on twitter:

Read more, distract less. #letsgo

Hardik Parmar

June 2020 Web Service Update

I’m starting a new series of posts detailing changes I release to the Web Service. The Web Service is responsible for syncing your account across your devices and browsers. It also caches new articles so you only fetch information from sources that have changed since the last sync. 

  • I keep getting error reports from the Web Service in a unified private channel on Elytra’s Slack group. I use these reports to patch bugs as soon and as quickly as I can. 
  • Yesterday, I received some errors regarding adding feeds using the ftr.freshangle.net service. This is the first I had heard about so I quickly investigated and found some issues in Elytra’s code that prevented these feeds from being processed. The ftr.freshangle.net service now has first class support in Elytra for both the XML and JSON feed endpoints. 
  • There was a major sync bug in Elytra’s code both on the Web Service and iOS App. I released v1.7.4 on iOS to patch this issue and patched the Web Service as well. By morning of 4th June, these errors dropped down to just 12% compared to the day before it. As soon as all users update to the latest version of the iOS App, this should drop down to 0%. If you still haven’t updated, check the App Store for updates. 
  • On 2nd June, we faced an interruptions and eventually an outage from our service provider which caused Elytra’s first ever downtime this year. Things eventually began recovering by 03:30AM IST on the 3rd of June. Everything is now stable. This outage resulted in some angry customers and I completely understand that. If you ever face any issues with the App or Service, always feel free to contact me at support@elytra.app

On a separate note, a White Hat Hacker recently got in touch with me regarding a critical issue with the API Service. I have since patched the issue. No data was affected as the core issue had to do with DNS setup for emails sent from Elytra’s domain. 

That’s it for this update. Happy Reading! 

A lot of Unread Articles

If you launch the app or open the web app (if you have access) and notice a sudden surge of unread articles waiting for you, I can explain.

Traditionally, to check if an article is unique and new, I checked its GUID which the feed provides and checked if it already exists in Elytra’s database. This works fine if there is only one source for an RSS feed. It breaks when there are multiple sources for a single website. This happens when say I subscribe to a Website’s XML Feed and someone else subscribes to its JSON Feed. Both sources are valid, but both bring in articles with the same content and GUID. So the articles would map only to the first feed. The second feed would never get new articles. 

To solve this problem, I just updated my unique constraint to also use the Feed’s unique ID. The new unique pair constraint of GUID-FeedID works for all feeds from a single website, irrespective of which source the user subscribes too. 

This caused a huge surge in unread articles for all users. I do apologise for having overlooked this issue, but on the bright side: We all have a bunch of articles to read over the weekend which we missed out on, no thanks to me. 

Summer 2020 Update

The Summer 2020 update is here. 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 the full change log:

New

  • Support for Mouse/Pointer Interactions on iPadOS 13.4.
  • New Custom Feed: Today. All articles from the day, read and unread. Sort by your own preference.
  • Now add Youtube Channel RSS Feeds directly from the Share Extension.
  • Article Reader Customisation: You can now customise your reading experience based on your personal preferences. Set line heights, font sizes and individual fonts for paragraphs and headings.

Improvements

  • Improvements for handling Youtube URLs inside the app when adding a new channel feed.
  • Push Notifications will now show richer previews if you open them in context.
  • Show refresh control animation when the app loads and is loading Feeds data from the API.
  • GIFs will now show the first frame if the Image Proxy is enabled.

Fixes

  • Fixed incorrect paragraph line-spacing calculation with the selected value for font size.
  • Fixed an issue where opening a push notification on iPads would open them in the primary column.
  • When you tap on a push notification while another article is open from a Feed, the Feed now correctly deselects the active article.
  • When you tap on a push notification, the app sets up correctly on the iPad. If you tap on a Feed after this, it no longer dismisses the previously opened Article.
  • Fixed a crash when creating a new Folder for the first time.
  • Fixed GIF playback.
  • Fixed an issue where an article would remain marked as Read even after opening it.
  • Fixed font sizes for the Feed description on iPads.
  • Fixed a type bug on the iPad where the font sizes were comically large for titles.

RPC First Class Support

Back in December 2018, I wrote a post about RPC Pings support in Elytra. I cannot believe it has been that long. Later in 2019, I promised to bring first class support to blogs that implement RPC pings to Elytra. 

I have just finished implementation and it is now live. To recap the steps from the earlier blog post, let’s assume you have a WordPress Blog. 

…if your blog runs on WordPress, you can add the following URL: https://api.elytra.app/rpc-ping under > WordPress Blog’s Settings > Writing > Update Services. 

That’s it. WordPress handles all the complexities for you. If you use Micro.blog, you can find instructions here. You can adapt that shortcut to send RPC pings for any website you host as well as to any other service other than Elytra. 

Here’s what happens in the background:

  1. Your website/script sends an RPC ping to Elytra.
  2. Elytra immediately processes your website’s RSS Feed. 
  3. Any new posts are added for your subscribers to read. 
  4. Additionally, users subscribed to your blog’s push notifications from the iOS and iPadOS Apps are sent a push notification.

Starting today, 29 Mar, 2020: Once your blog sends at least 5 pings every 14 days, Elytra will no longer poll for changes to your RSS feed. Elytra will then assume that you will send RPC pings every time content on your website is updated. If no RPC pings are posted for 14 days, Elytra will once again begin polling changes at regular intervals until the 5 pings are received and the cycle can repeat. 

So you get the benefit of real-time updates, push notifications and no penalties for downtime. This hugely benefits users using a blogging platform like Github Pages, Micro.blog, etc. that don’t inherently support WebSub yet. You can use this for your WordPress based blog as well if you don’t want to install the WebSub plugin for whatever reason. 

Starting with v1.7, users of the iOS and iPadOS apps will also be able to subscribe to feeds for Push Notifications which use RPC pings. 

I invite your feedback on this feature if you decide to implement and make use for it. For any questions, please feel free to email me at support@elytra.app. Enjoy Reading. 

Spring 2020 Supplementary Update

Youtube is very wide, densely spread content aggregation service which almost every single one of us has used at least once. Youtube has supported RSS Feeds for channels for a while now; for as long as I can remember actually. Although, it makes it very hard to find and subscribe to them. There is no direct option to do so. 

Until recently, I traversed a channel’s homepage and realised that Youtube advertises these links, like any good citizen of the WWW should. So now when you enter your favourite channel’s URL in Elytra, the app will automatically fetch the RSS Feed URL for you and add it to your account. 

I’ve further programmed Elytra to know the 3 varieties of the URLs Youtube uses for channels and handle all of them gracefully. I’ve personally configured mine to all go inside a Youtube folder so I can tap on the folder to view its custom feed and go through all published videos. 

In v1.6, I also updated how Youtube videos are handled in the app. It now uses the HLS stream which automatically configures the player based on your device settings like Low Power Mode, Low Data Mode, and the like. So it’s very energy efficient compared to opening the main stream or embedding in a web view. 

Unfortunately, Youtube does not support WebPush/PubSubHubBub on these feeds yet, and I doubt they ever will. 

If you need to import all your channels, you can follow Google’s support documentation which can be found here

As always, if you like the app, please take a moment and rate it on the App Store. It helps the app and me a lot. Happy Reading.

2019 – Year in Review

2019 has been Elytra’s first full year in Production. It has since gone from v1.1 to v1.5 with work having begun on v1.6 before I left for a small vacation (following my wedding) in December. 

Over this year, Elytra’s UI has evolved significantly and with the v1.6 changes, it is about to become a whole lot better. Here are some quick stats over the year, reflecting on how Elytra has grown: 

  • New Feeds: 2K+
  • New Articles: 5M+
  • New Users with Push Notifications Enabled: 700+
  • Average Unique Articles read every day: 100+
  • Average Unique Users active every day: 100+

To put these numbers into perspective: 

  • New Feeds YoY Change: + 1666.67%
  • New Articles YoY Increase: + 312.5%
  • New Users with Notifications Enabled YoY Change: + 8750% 
  • Average Unique Articles YoY Change: +850%
  • Average Unique Users YoY Change: +1800%

I also managed to reduce Elytra’s Monthly server bill by 15% by optimising certain parts of the code while improving processing speeds. Once I get that figure down to approximately 40-50% (or revenue increases which bridges the gap), I hope to pass on the savings to Elytra’s users and finally introduce the Free Tier. 

I wish you all a very Happy New Year. May all your plans for the new year succeed.  

Elytra Winter 2019 Update

Winter is coming… soon. The Elytra Winter 2019 update is already here though. 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 the change log:

iOS App

What’s New

Elytra's Updated Sign In Interface

New Push Notifications Interface

New Image Viewer Interface

  • Added a new Bookmarks Manager. This is much more efficient system compared to the previous system and is much more scalable. This is a non-UI update so you’ll see a lot of performance benefits from this.
  • Sign in With Apple. If you’re new to Elytra, you don’t need to take any additional steps. If you’ve been using Elytra and are updating to the latest version, please head over to Settings > Account and link your account from there.
  • Image Viewer: Tap on an image in an article to open it in a full screen image viewer. All images from the article are gathered in single place for easier viewing.
  • Push Settings: View a list of publishers you’ve subscribed to receive push notifications from.
  • Added Settings Sync to work in tandem with the web app. More on this soon.

Improvements

  • Adding a new feed from the search interface now increments the unread count.
  • Removing a feed now decrements the unread count.
  • Recommendations interface now correctly shows the custom Feed name if one is set.
  • Improves how the app handles & reacts to memory pressure warnings from the OS.
  • The Author Interface now shows the author’s name prominently and defers the blog’s name to the subtitle.
  • Drastically improved managing of unread counts in the app.
  • Improved behaviour of the app when marking backdated articles as read.

Fixes

  • Fixes push notifications opening the wrong feed.
  • Fixes push notifications not opening the article on iOS 13.
  • Fixed a bug where the app would re-sync all bookmarks even if they existed locally.
  • Fixed the Settings icon for the Push Notifications row not showing up on some devices.
  • Fixed the activity indicator persisting on screen when only one or no page exists for unread items.
  • Fixed a potential crash when opening new feed interface.
  • Fixes loading of unsupported image formats. Loading an SVG image would cause the app to crash.
  • Fixed last updated date not matching the actual refresh date when manually refreshing through the User Interface. This only updated when fetching via background refresh.
  • Fixed an issue that would cause a corrupted navigation bar in iOS 13.
  • Fixes a crash which could occur when the Trial Interface was presented.
  • Fixed linked images which would not render if they were contained inside an anchor blog with multiple other elements. These other elements were usually line-breaks preventing the entire block from rendering properly. Affected blog: Saturday Morning Breakfast Cereal..
  • Removed webp support.
  • Images are loaded using the same extension from the proxy as the source image.
  • Fixed a small bug with the unread count when marking read automatically from the article reader.
  • Fixed an issue with image loading preferences. “Never Load Images” now works properly in the Articles List & Article Viewer.
  • Fixed some really nasty memory leaks.
  • Fixed a crash that would occur when launching the app. This was a regression introduced in Build 275 of Elytra and OS 13.1.2.
  • Micro.blog posts with images now show the image as a thumbnail in the articles list when settings are enabled for it.
  • Fixed the colour of the summary label (iOS 13 only, correct on iOS 12).

API

I have been discussing with a few developers across platforms to open Elytra’s API to them so they can also build apps on top of it. I hope this takes off because that’ll mean more and more apps will be using a more private and secure way to read their favourite RSS Feeds. 

Other than that, I have made some significant changes to the API and RSS Feed Poller in this update. Here’s a quick change log of things which affects us as Elytra’s Users:

  • The RSS Feed Poller now fetches more frequently and now fully complies with all HTTP caching mechanisms. Previously I only used ETags to know if a feed document was fresh or stale. But this sometimes resulted in unnecessary requests. If a Feed now tells that the content is to be considered fresh for a day, that will be respected. 
  • Improved the WebSub protocol support. If you write on your own blog, I urge that you check if whatever engine runs your blog supports WebSub. If you’re using WordPress, there are plugins with enable this feature. It’s simple to setup and you get free real-time notifications for your readers.  

Thank you for your continued support and feedback and criticism. I will continue to work on the iOS and Web apps through November. I’ll be unavailable on email in December but please feel free to get in touch, I’ll try to reply to you during that time whenever possible. Happy holidays. 

October 2019 Update

Half of October is over and I have a short update for you. 

Elytra v1.5 is on track and includes new systems for:

  • Unread Articles
  • Bookmarks
  • General Articles

What’s new: How articles are loaded, and when they are loaded. I am delaying loading data from the network as much as possible so as to not be too eager to cache too early. This achieves one primary goal: reduced bandwidth usage. Also makes handling and expanding things easier for me in the app, but nothing you should concern yourself with. “Yay!” for both of us! 

I hope to have v1.5 ready to ship towards mid-November and close the pipeline by end of November.

I really did not know a better way to announce the next bit so I am going to sneak this one in here: I give you, a first look at Elytra for the Web

Elytra for Web - Unread - Light Theme

Elytra for Web - Unread - Dark Theme

It is no where close to complete. I have barely gotten the article renderer to work with the basics. Lots of long coffee fuelled sessions still to go.

I decided to do the Web App first while I continue to work on the design of the macOS App and continue to improve the iOS app. The iOS app is pretty stable in v.1.5 now and has everything we need it to have, so now I can assign time to other platforms. 

Over the next couple of weeks, I’ll share more progress on this blog so stay subscribed through the RSS Feed. I’ll share Alpha Testing notes about the Web App later in November.  

Moving to Sign In with Apple

For v1.5, which will be a supplementary update to the v1.4 Fall update, I’m considering moving the authentication system to Sign In with Apple. I’ve just finished testing this system and it works as advertised, however it took much much longer than it should have. 

It works well on iOS, as well as the web. This is very important for me as all previous mechanisms I had looked into to link the session in your browser to the iOS app had too many steps.

Sign In with Apple is by far the most efficient system and still ends up giving me a single User ID to work with, no emails, no names, nothing. So it also keeps in line with Elytra’s Privacy Policy.

These changes should become available in the following weeks as I publish the v1.5 Beta Builds to TestFlight  for preliminary testing. All new users will have to use Sign In with Apple ID. All existing users will have to migrate their account to it, which I’m trying to keep simple.