Unread 4.9.5 is available from the App Store. This update fixes article rendering on beta releases of version 26.6 of Apple’s operating systems.
Addressing this required making a change that warranted adding this to section 9a of the Unread privacy policy:
Showing a YouTube video requires embedding an iframe from Unread’s servers. That iframe embeds the youtube.com iframe. Our log files will reflect that a user from a specific IP address requested a specific YouTube video. Requests for these iframes do not include account identifiers or personally identifiable information.
Technical Details
Unread uses WebKit, specifically WKWebView instances, to display articles. Unread builds an HTML document containing the article content, and tells the WKWebView to display it.
Most HTML documents contain references to external objects containing things like stylesheets and images. Article HTML documents generated by Unread contain references to Unread’s stylesheets, fonts, and more. Since those objects are embedded in or generated by the app, their URLs use custom schemes such as unread-local-file:/// to load them.
In the newest betas of version 26.6 of Apple’s operating systems, HTML documents with HTTP and HTTPS base URLs are unable to load objects with these custom URL schemes. In this context, a base URL is the optional URL supplied by the app to the WKWebView when the app tells the WKWebView to display an HTML document from a string:
open func loadHTMLString(_ string: String, baseURL: URL?) -> WKNavigation?
When the base URL is nil, objects with custom schemes load as expected. When the base URL is an HTTP or HTTPS URL, objects with custom schemes do not load on the newest beta releases of version 26.6 of Apple’s operating systems. I believe this is a WebKit bug, and I have reported it to Apple.
Now Unread specifies a base URL of nil, and this addresses that problem.
YouTube
Specifying a base URL of nil seems better anyway. Unread had been specifying a base URL of nil for a long time, until Unread 4.6.5 in October 2025. In that release, I started sending an HTTP base URL to the loadHTMLString function. I did so in response to a YouTube change that broke embedded YouTube videos when YouTube iframes were loaded without an HTTP or HTTPS referrer. Specifying an HTTP or HTTPS URL as the base URL made the WKWebView send it as a referrer to YouTube.
Specifying a nil base URL required a different solution for making YouTube videos continue to work. I ended up implementing a YouTube embed relay. Instead of the Unread-generated HTML document embedding an iframe from youtube.com, it embeds an iframe from Unread’s servers. That iframe contains only a youtube.com iframe.
Requiring a request to Unread’s servers to load a YouTube video is a tradeoff, but specifying a base URL that was not necessarily representative of the document origin had other drawbacks. Implementing this change lets me provide immediate relief to customers running the 26.6 beta releases of Apple’s operating systems while also keeping YouTube video functionality working.
If you enjoy using Unread, please consider subscribing to Unread Premium.