Elytra Blog

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

Elytra November Update

Happy Holidays! October has been a great month for Elytra on multiple fronts:

  1. The app’s first few subscriptions kicked in after the 14-day free trial periods. Many of you’ll sent me emails regarding the pricing, some left App Store Reviews (being able to respond to them is a great feature) raising their concerns. I have been able to take action on this. I’ll talk more about this in a bit.
  2. October brought in a bunch of bug fix releases for the app, while I continued to work on new features and improving the general stability of the app.
  3. I managed to acquire some new Beta Testers who have been really good with giving me feedback on new features. I’d like to work out a way wherein with their explicit permission — include their names in the credits section.
  4. There is a now a subreddit for Elytra if you want to discuss, propose new features or just have a public discussion related to the app.

What’s New

Let’s begin with all the new features and improvements in v1.1.0:

Folder Feeds

Folder Feeds in Elytra v.1.1.

I probably have 14–15 emails in my inbox requesting Folder Feeds. Honestly, I had never considered this. I worked with a couple of them to get the correct implementation of it. I’m very happy with how it turned out. This makes a minor change to how folders work in the Feeds’ Interface:

  1. The previous interaction of tapping on the Folder row now opens the Folder’s Feed.
  2. To expand or collapse the Folder: tap on the folder icon.

Sorting Options

New Sorting Options in Elytra v.1.1

The second most requested feature was being able to sort the feeds in ascending order: oldest articles first. While it sounds relatively simple (and it is, if all the data was locally available on the device), this turned out to be a slightly complicated transaction on the sync server. A single user requesting this information was fine but when I simulated it with at least 100 simultaneous such requests, things quickly broke down. By changing how a few things work on the sync server, I was able to heavily optimize this and also include the ability to only fetch Unread articles for that feed in any sorting order. This is great when you’re going through a large feed and only wish to read unread articles.

Type Improvements

Type Improvements for larger accessiblity sizes in Elytra v1.1

I’ve always invested a lot of time optimising and tuning the Type rendering in the app. I recently found some sections I accidentally ignored with the Accessibility Type settings. The app now respects these settings correctly and ensures you get the optimal reading experience. This is also the precursor to the improved layout engine which is scheduled for the next release.

Corrected Bold Text implementation in Elytra v.1.1

I’ve also taken this opportunity to improve support for the Bold Text setting. The app now respects this setting correctly throughout the app with a sole exception: In the Article reader, when using the Georgia or Merriweather font — these fonts do not offer the correct font-weight used to render text with this setting. The app falls back to using the bold font-weight. If this is not desired, I will recommend using an alternate font.

Image Loading

New Image Proxy options under the Image Loading Preferences in Elytra v.1.1

This version brings a big improvement to how images are loaded. Thanks to images.weserv.nl, an Image Proxy is now available for loading images over a CDN. This is optional and is disabled by default. Some problems we face when loading images:

  1. Most blogs do not provide multiple image options depending on the size of the device.
  2. Some blogs embed massive images which aren’t an issue for Desktop class browsers, but heavily strain memory, battery and RAM on mobile devices.
  3. Some blogs, due to various constraints, cant serve images over a CDN or a fast network which degrades performance for us. By using an Image Proxy, Elytra can work around these problems by:
  4. Based on your Bandwidth and Sizing preferences: load an image of the optimal quality.
  5. Based on your current device’s size: load an image of the optimal width or height.
  6. Utilize the CDN being used by the proxy to download the images from the nearest node. Technical Note: The quality parameter is affected by your image sizing preference, the current device, if you’re using an iPad — the size of the app if being used in multi-tasking mode and the current network type. A combined score is generated whenever any of these parameters change and the new score is used to determine the quality parameter. In my non-scientific testing, I observed significant bandwidth savings, improvements to the energy consumption graphs for the app as well as memory savings since the app now loads significantly smaller images while offering the same visual quality you’re expecting. This also saves some CPU cycles by preventing your device from having to downscale images. Without WeServ’s Free Image Proxy, this would not be possible.

Extended Layout

Extended Layout on iPad Pro utilising the real estate on the device more efficiently.

After realising that I am not optimally utilising all the available real estate on iPads, I worked on the Extended Layout for iPads (this is also available on iPhones but is disabled by default). This brings two critical improvements to the iPad app:

  1. All Feed Interfaces (Unread, Bookmarks, Feeds and Folder Feeds) now get a two column layout for article lists provided enough width is available. This interface can also now be extended to use the full screen which seamlessly transitions into the Article Reader interface.
  2. This brings preliminary support for changing the active theme for the app while reading an article, although it is still more taps away than necessary. I plan to improve this in the next release. This was deferred for this release as it heavily relies on the Layout Engine improvements I am working on right now.

Apart from the above new features I have also fixed a bunch of bugs, improved VoiceOver support where ever it was broken, and continue to work towards beginning to localize the app. You can find the finer details in the Release Notes on the App Store.


I mentioned earlier about a lot of users voicing their concerns over the Subscriptions’ pricing and the lack of a One-Time purchase. With the thought of reducing the pricing lingering in my mind, I was unable to justify it with my current infrastructure costs. I recently ran into this announcement from AWS (I probably missed it because I was preparing for Elytra’s launch at the time). After exploring my options, I determined that it is a definitive upgrade for me while lowering my server costs, the benefits of which I am able to pass on to you. With immediate effect:

  1. All subscription prices have been dropped by 1 Tier. This is effectively a 1/3rd reduction in the cost of the subscriptions.
  2. Anyone who has purchased a subscription prior to the release of v.1.1 will be automatically provided with extra days (or months if you purchased the annual subscription) on their current subscription. No extra action should be necessary from you. If this isn’t immediately reflected, restoring your purchases will update this.
  3. All new subscriptions will be available at the new reduced pricing.
  4. An additional Life-Time purchase is also available. This will include all future updates, improvements, dedicated support and a round of your favorite beverage on me when you’re in my town or I am in yours!

My goal with Elytra was to make reading on iOS devices accessible to as many people as I can reach. With your constant feedback, criticism and kind words, I have been able to continuously improve the app. I will be taking a short break from all development work and spending time with my friends and family over the Holidays. I will try my best to reply to your emails in a timely manner and frequent the new Elytra subreddit as often as I can. Cheers!

You can find the discussion around this post on here.

New Servers and Scheduled Downtime (October)

New Servers

I’ve just finished work on a new set of servers in the Singapore region. These servers will now handle traffic for all of your requests from the South East Asia region. You should experience lower latencies, faster load times and over all improved speediness in the app. 

Users in the European and American regions are currently unaffected by this change. 

Scheduled Downtime

There will be a scheduled downtime of the Elytra Service starting 28 October at 09:00PM IST (28 October, 3:30PM UTC) up to 29 October, 02:00 AM IST (28 October, 8:30 PM UTC).

During this time, I’ll be upgrading some of the servers in the US-East region for improved efficiency, reduced costs and higher throughput overall. The service will remain unavailable during that time to the users in the American and European regions. Service will continue as expected for users in the South East Asian region. 

Due to the change in the pricing for the servers, the benefits will be passed on to you. I’ll share more details on this later. 

I’ll appreciate your patience during this scheduled downtime. You can find the discussion on this post on Reddit.

1.1.0 Roadmap

I’ve spent the weekend planning for the upcoming 1.1.0 release of Elytra. It’s been a very enlightening weekend for me as to what ya’ll are looking for in an RSS Reader as well as some features and improvements I want to bring to the app. 

This is what the Roadmap is currently looking like for this release. 

Elytra 1.1.0 Roadmap presently scheduled for 20 October, 2018.

If there is something else you’d like to see included in this release, please feel free to email me, or you can also find me on Twitter. My Direct Messages are open to everyone. 

The date in the screenshot is a tentative date and is likely to change but as far as possible, I’d like to stick and commit to that date. 

If you notice, we have an established schedule here. 1.5 months per release is a decent timeframe. There is no guarantee that it’ll be maintained due to several factors being outside my control, I will certainly try my best.

Test Flight Update

As work has now commenced on the 1.1.0 release, if you haven’t joined the latest Test Flight Beta group, you can now do so from this direct link: https://testflight.apple.com/join/WiHZBq4P

That is all from me for this week. I’m most likely going to be a hermit for this week sorting out all the layouts and such so please do excuse me if I respond to your emails slower than usual. 

1.0.2 is now Available

Elytra 1.0.2 is now generally available on the App Store. You can read the full change-log on the App Store (I wont repeat it here) but there are a few changes which I’ll be talking about in this post. 

New On-Boarding

When I was Beta testing the app, Craig Hockenberry gave me critical feedback that prompting users for an In-App Purchase when on-boarding them was a bad idea with Auto-Renewable Subscriptions. I agreed with him and changed this later. This was bad because the onus was on you to cancel your subscription in time if you did not like the app. 

With this release however, Auto Renewing Subscriptions are no longer available until I resolve this issue with the App Store Review team. The App now implements non-renewing Subscriptions and offers a single Free Trial period of 14 days. 

Since I was implementing this change, I decided to rework the On-Boarding UI as well. Here’s how it looks now:

New Onboarding - Launch Screen New Onboarding - Private Account New Onboarding - Free Trial Unlock

I’d like to hear your thoughts on this.

Improved Voice Over Support

I continue to improve Voice Over Support throughout the app and this build corrects a few issues when reading paragraphs, especially if you rotate your device or when paragraphs are drawn as you scroll.

What’s Next

Getting this build out took much longer than I expected. I hit the wall several times with App Store Review but I’m glad all of that is finally over. I can now continue to focus on actually implementing new features and improving the app.

So, I have 1.0.3 in the pipeline already with a couple of more fixes to the actual reading experience before I begin work on 1.1.0. So if you’ve been waiting for a Test Flight Beta Invite from me, you can expect that soon now.

If you love the app and would like to be on the Test Flight Beta, just ping me in the comments on the website or ping me on Twitter or Micro.blog.

As always, I’d love to hear from you and to everyone who has a purchased a subscription: Thank you for supporting my work.

Finer Details of Elytra.app

There are some very interesting details on Elytra’s website which you most likely have not noticed. This is by design. These are invisible details that are engineered to make your experience on the website more private and be good to your devices. 

Respecting your Privacy

Like most landing pages for apps, products and services, Elytra’s website too loads the Google Analytics script. But the script itself does not respect the DNT Header your browser may be sending. To work around this, I added a simple check before calling the code that begins tracking page views. 

if ((‘doNotTrack’ in navigator) && navigator.doNotTrack == “1”) {
console.info(“Do not track is enabled. Exiting”);
else { // Regular GA code }

This simple piece of code will respect your privacy settings and only if you allow will begin page views tracking via Google Analytics. Considering the critical role Privacy plays in Elytra’s core, this seemed obvious. 

Respecting your Devices

Elytra’s landing page also includes 3 videos. These are kind of big. Total to about 35MB but varies depending on what codecs your browser supports. It is obvious that it does not make sense to load videos on all devices. It is also obvious that loading these videos on metered or cellular connections like 2G and 3G would be wasteful as the page would never complete loading. Most people would close the tab and move on. 

Elytra’s website uses the new navigator.connection object to determine if videos should be shown. If it determines that videos should be discarded, it simply replaces them with cover images that fit the context. 

Safari on iOS and macOS does not support it yet, so the viewport size is used to determine this. As soon as Safari supports it, directly or by using the webkit prefix, it’ll kick into action. 

This not only correctly conserves data bandwidth, but also power and is respectful towards batteries of your untethered devices. 

Respecting Accessibility Requirements

Just like the iOS App, the website tries its best to be accessible. When designing the FAQ and Press pages, I decided to use the details and summary tags instead of hacking something on my own for creating collapsible sections. There is a lot of sample code, some which is even accessible, out there which creates collapsible sections, but nothing seemed to work as effectively as these two tags in tandem. You can read more about them on MDN

This made the two pages  accessible not only to screen readers, but also for people who use the keyboard more than a pointer device to navigate webpages. If this is new to you, I’d love for you to try it out. Its fun!

While on the surface, Elytra’s landing page may look simple or even boring to some, I wanted to focus on getting the information to people who seek it. Aesthetics are important, but making and keeping your website Accessible, Private and Fast was paramount. 

Something I want to explore when updating the website next is to localise it. So if you have any tips for me, do let me know. 

Hello, App Store

Elytra 1.0.0 is now generally available on the App Store. There’s also a shiny new website

From having of the most volatile, overwhelming pre-releases announced on Twitter, to getting some really cool, critical, and supportive Beta Testers, to the Subscriptions rejection a few weeks earlier, my journey with Elytra has been an absolute roller coaster.

When I started working on Elytra back in November I had no idea what to expect. I was very surprised that people really yearned for a new RSS Reader option. The responses on Twitter only made by presumptions more concrete: I want this. A lot of people want this. This needs to be on the App Store. 

There a lot of changes between the last Public Beta build and the App Store version. I wont go into too much detail here, but rest assured, it’s a more stable app. It isn’t completely stable though which is why I have version 1.0.1 ready to go for Review as soon as 1.0.0 is released. 

During the Public Beta, people sent me a lot of emails with feature requests, ideas and suggestions to make Elytra a better app, a better product. I’ve been communicating with a lot of people back and forth to evaluate and solidify these ideas and I am very excited to start working on those. 

As always, please feel free to email me or tweet/toot at me with ideas, questions or just stop by to say hi. 

App Status Update

TL;DR: Please copy your Account ID and keep it safe somewhere (Notes.app or whatever else you may be using for keeping notes). When the app launches on the App Store, if you wish to retain your account, you can use the same Account ID to get access to your feeds again. If you want to be re-inducted into the Public Beta, please send me an email stating so.

Elytra went through a second round of App Store Review following an appeal and it got rejected again. As I noted in my previous post (You can read it here), if that ended up happening, I’ll have to take some drastic steps. 

Since I cannot transfer an app which uses iCloud in any way, I had to recreate Elytra on my new Developer ID. 

Test Flight

With this change, I ended up with two identical apps on my phone. This is fine for me, however, the ramifications of this are big if you are part of the Beta Testing groups. 

The former Developer account expires tomorrow which will remove Elytra from Test Flight (renamed to YetiReader so I can continue using Elytra on the new account). If you wish to continue being a part of the Public Beta group, please send me an email through Test Flight or direct at: info@dezinezync.com and mention your Test Flight Email ID.

A good thing to come out of this situation: I have a much much better build which I’ll be shipping as 1.0.0. I’ve added multiple fixes, improvements and UI polish which was lacking from the latest build currently available. 

I am not sure if the Test Flight build will continue to work once the former account expires. I know the build will no longer be available, but I am not sure if it’ll continue to work.

App Store

I believe I have a better idea as to why Elytra was rejected from using Auto Renewing Subscriptions. It’s just a guess at this point. I’ll be submitting the new build from the new account on Monday with all the new changes and improvements. I’m getting everything in order over the weekend. 

Hoping everything goes well this time round. If you no longer wish to be a part Public Beta, you don’t need to do anything. If you wish to continue using Elytra when it releases on the App Store, I strongly recommend you copy your Account ID to somewhere safe like Notes.app or whatever else you may be using. 

Thank you for sticking by me and keeping me motivated. 

AppStore Status

Elytra’s App Store status has been quite a weird roller-coaster ride for me. I’ve had my fair share of odd App Store rejections in the past, but none like this one. 

After going in to the In Review status, the App was rejected a few hours later for including Auto-Renewable subscriptions. This seemed odd considering all the information Apple requires apps to be displayed on the Purchase screen was there. Turns out, that was not case. The subscriptions were rejected because they were, “Not valid use of the service”. 

Upon presenting my case in the resolution centre that Elytra was adhering to all rules as laid out by the App Store Guidelines, I was once again told that this was invalid use of the service. The reviewer recommended that I instead use a Non-Auto Renewing Subscription. 

At this point I decided to write an appeal to the App Store Review Board and see what happens. The In-App Purchases are back to being In Review and the app itself is now Waiting for Review..

Where does this leave me?

The account on which Elytra is being reviewed expires shortly. I have a new account all set up and ready to go and I don’t plan to renew the existing account if the app does not pass review. I’ll setup and resubmit the app from the new account. 

However, if by some miracle, the app does pass review now, I’ll promptly renew the account and continue using it. If this happens, I have nothing else to do. I upload the website and release the app. 

If I do end up setting it up on the new account:

  • TestFlight access to the app will cease.
  • Since I’m setting up a new app, it will no longer use data from the old app. Your subscriptions will be safe and you can simply setup the same account in the new app. 
  • I’ll have to implement a Non-Renewable Subscription which isn’t the best user experience considering you’ll have to manually renew the subscription every month, 3 months or year depending on your subscription type. 

So I hope things work out for Elytra as it stands right now. Setting up a new app will be incredibly tedious to say the least with a lot of undesirable effects. 

I simply wonder why the Review Team is rejecting Elytra’s use of Auto-Renewable Subscriptions when prior art for the purpose exists in the App Store. Heck, its even promoted in Searches.

Auto Renewing Subscriptions on the App Store including promoted subscriptions in App Store Searches

Last round on me!

This is most likely the last build of Elytra which will be going out to the Public Beta testers. It mostly contains a few minor fixes and two new additions. Read on to learn more.


  • Long tapping on the All Read button (Double checkmark) in a Feed’s interface will enable you to mark all unread articles as read, including articles not currently loaded in the interface. This is especially useful when you add a new high frequency feed to your list.
  • You can now optionally use a Dark Application Icon for Elytra. A new Miscellaneous section has been added under settings.


  • Tweaked the Application Icons to render correctly on displays which use the sRGB colour profile.
  • Updated the footer text in the Subscriptions Interface to be compliant with Apple’s requirements. This is critically useful for you as well as I have come to realise. (I’m secretly hoping Elytra passes Apple’s review in the first go, as we all do :D)
  • Fixed application launch on iPads when running Elytra for the first time on the device.
  • Scrolling to load the next batch of articles now consumes less power. This is done less frequently now by using an alternate system API.
  • Fixed the status bar being dark (when a dark theme is selected) for the Move Folder interface.
  • Tapping on the Close button on iPads now deselects the currently selected article.

Version: 1.0.0
Build 127
Pipe: PBeta-04

The Final Epoch

I’ve received numerous emails and messages over the last two weeks requesting new features and reporting bugs. This build is a culmination of all of that including bug reports and feature lists we’ve compiled internally. 

What’s new

  • You can now share the Feed’s URL (and website’s URL when available) from the swipe menu. The same is accessible when dragging cells on iPads supporting drag and drop. 
  • State Restoration has now been implemented in tandem with Background Fetch. 
  • With the background fetch change, the refresh activity indicator will now also show the last refresh time if one is available.


  • Images are no longer affected by Smart Invert. Strict Invert will still invert the colours in images. 
  • Improved image caching
  • Improved memory usage when loading and displaying images (especially on iPhones)
  • Improved multi-tasking behaviour on iPads (Slide Over was majorly broken in previous builds)


  • Removed the trailing line-break from Lists
  • Fixed long tapping on the Account ID during setup to crash the app. (This gesture has been removed and replaced with a single tap gesture)
  • Aligns the section header’s title with the labels of the cell. 
  • Correctly manage unread and bookmarked states when article states change via the toolbar in the Article interface. 
  • Fixed a crash when linked header identifiers contained non-URL safe characters.
  • Fixes the blank window on app launch (including bringing the app to the foreground) which occurred in unusual circumstances only on iPads.

Web Service

  • Improved the performance of fetching unread items (on the server) by a huge margin. This could previously take over 30s and now shouldn’t take more than a second.  

This probably brings us to the end of the Beta runs for Elytra. I’ll be resuming work on the launch of the app now and if there are any bug reports that come during this period, I’ll work on those. But the feature list is now frozen and everything deferred to the 1.x versions.

A big thank you to everyone who has been testing the app and sending me feedback. I still have a lot of people to invite to the beta testers list and I’ll resume on that shortly. 


  • Version: 1.0.0
  • Build 119
  • Pipe: PBeta-04