{"id":1031,"date":"2026-05-15T12:31:34","date_gmt":"2026-05-15T03:31:34","guid":{"rendered":"https:\/\/blogs.igalia.com\/gyuyoung\/?p=1031"},"modified":"2026-05-15T12:32:47","modified_gmt":"2026-05-15T03:32:47","slug":"blink-for-apple-tvos-2026-update","status":"publish","type":"post","link":"https:\/\/blogs.igalia.com\/gyuyoung\/2026\/05\/15\/blink-for-apple-tvos-2026-update\/","title":{"rendered":"Blink for Apple tvOS: 2026 Update"},"content":{"rendered":"\n<p>At BlinkOn 20 in 2025, I introduced our experimental work on bringing <a href=\"https:\/\/youtu.be\/MpOxNPeWf6I?t=75\">Blink to Apple tvOS<\/a>. You can also find a blog post covering that initial work here: <a href=\"https:\/\/blogs.igalia.com\/gyuyoung\/2026\/05\/09\/introduce-blink-for-apple-tvos\/\">https:\/\/blogs.igalia.com\/gyuyoung\/2026\/05\/09\/introduce-blink-for-apple-tvos\/<\/a>.<\/p>\n\n\n\n<p>If you\u2019re interested in the background and early prototype, you can find more details in my previous post on Blink for iOS and related work: <a href=\"https:\/\/blogs.igalia.com\/gyuyoung\/2024\/08\/08\/chrome-ios-browser-on-blink\/\">https:\/\/blogs.igalia.com\/gyuyoung\/2024\/08\/08\/chrome-ios-browser-on-blink\/<\/a>.<br><br>Over the past year, we have continued developing this effort, and I recently had a chance to share <a href=\"https:\/\/docs.google.com\/presentation\/d\/1LrHI7AAqQcNg5t56lddZmdE-4GKZHTy4zaXjCY2-pEg\/edit?usp=sharing\">an update<\/a> along with a demo running on a real Apple TV device at BlinkOn 21 in 2026. In this post, I\u2019d like to walk through what has changed since the initial prototype, what works today, and what challenges still remain.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A quick recap<\/h2>\n\n\n\n<p>Apple TV runs tvOS, which is derived from iOS, but it comes with important differences. Most notably, tvOS does not provide a WebKit WebView for third-party applications. This means that any application requiring web functionality needs to embed its own web engine. This constraint was one of the key motivations behind exploring whether Blink, originally being ported to iOS, could also be adapted to tvOS.<\/p>\n\n\n\n<p>While the idea sounds straightforward, the reality is more complicated. tvOS lacks several low-level system APIs required for Chromium\u2019s multi-process architecture, which makes it impossible to use the standard process model. On top of that, BrowserEngineKit, which the iOS Blink effort relies on, is not available on tvOS. There are also platform restrictions such as the lack of JIT support, and the input model is fundamentally different since Apple TV relies on a remote control rather than touch or pointer-based interaction. Because of these constraints, our goal has not been to build a full-featured browser, but rather to enable Blink-based web capabilities in a way that works within the limitations of the platform.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Progress over the last year<\/h2>\n\n\n\n<p>Over the past year, we have made steady progress toward that goal. One of the most significant milestones is that we have upstreamed the initial tvOS implementation. This means that the work is no longer just an isolated experiment, but part of the upstream Chromium codebase. As part of this effort, we enabled content_shell running on the tvOS simulator and on actual Apple TV devices. Moving from simulator-only execution to running on real hardware was an important step, as it allowed us to validate real-world behavior and platform integration.<\/p>\n\n\n\n<p>We have also improved platform integration in several areas. Crashpad support has been added, and input handling for the Apple TV Remote has been significantly improved. The latter is particularly important because navigating web content with a remote requires a focus-based interaction model, which is quite different from what Blink typically assumes on desktop or mobile platforms.<\/p>\n\n\n\n<p>On the web platform side, we have enabled a number of features that make it possible to run more realistic content. WebAssembly now works in interpreted mode, which allows execution within the constraints of the platform. We have also enabled VP9 software decoding and verified hardware-accelerated decoding for H.264 and H.265. These improvements are essential for media playback scenarios and were necessary to support the demo content.<\/p>\n\n\n\n<p>To support ongoing development, we also set up reference bots for tvOS builds and tests. This helps ensure that the port can be maintained over time and reduces the risk of regressions as upstream Chromium continues to evolve.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demo on a real device<\/h2>\n\n\n\n<p>This demo shows playing a YouTube video in <code>content_shell<\/code> running on a real Apple TV device. The demo also showed that we can navigate the video using the remote controller, which highlights the progress we\u2019ve made in adapting Blink to the tvOS interaction model. While simple, this demonstration is an important milestone because it proves that Blink can run real-world web content on actual hardware.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2026\/04\/content_shell_tvos_device_kpop_daemon_hunders_small_size.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Current limitations<\/h2>\n\n\n\n<p>Despite this progress, several challenges remain. One of the most noticeable issues is build stability. The tvOS port has been broken frequently, mainly because both the iOS and tvOS ports are still experimental and not always considered in upstream changes. In particular, configurations such as the WebAssembly interpreter mode are not consistently handled by all changes, leading to breakage.<\/p>\n\n\n\n<p>Testing is another area where limitations are evident. Since the port relies on a single-process model, running web tests is currently not supported, which makes it harder to validate correctness and compatibility. There are also platform-level gaps, such as missing accessibility support and the absence of certain UI components like file choosers and color pickers. As a result, some web pages do not behave as expected on tvOS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Next steps<\/h2>\n\n\n\n<p>Looking ahead, our focus is on improving the robustness and maintainability of the port. This includes stabilizing the build, expanding test coverage, and investigating ways to run web tests in a single-process environment. We also plan to keep the port up to date with the latest tvOS SDK and continue maintaining it in upstream Chromium.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Closing thoughts<\/h2>\n\n\n\n<p>Over the past year, Blink for tvOS has evolved from an initial experiment into a working upstream port that can run on real devices. While it is still early and many challenges remain, the progress so far shows that it is possible to bring Blink-based web capabilities to a constrained platform like tvOS. We will continue exploring this space and see how far this effort can go.<\/p>\n\n\n\n<p>Finally, I would like to thank all the contributors, reviewers, and sponsors who made this work possible.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"285\" height=\"110\" src=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2026\/04\/youtube-logo.jpg\" alt=\"\" class=\"wp-image-1047\" style=\"width:237px;height:auto\" \/><\/figure>\n<\/div><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"234\" height=\"87\" src=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2026\/04\/igalia-logo.jpg\" alt=\"\" class=\"wp-image-1049\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Igalia Contributors<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Abhijeet Kandalkar<\/li>\n\n\n\n<li>Gyuyoung Kim<\/li>\n\n\n\n<li>Jeongeun Kim (Julie)<\/li>\n\n\n\n<li>Raphael Kubo da Costa<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>At BlinkOn 20 in 2025, I introduced our experimental work on bringing Blink to Apple tvOS. You can also find a blog post covering that initial work here: https:\/\/blogs.igalia.com\/gyuyoung\/2026\/05\/09\/introduce-blink-for-apple-tvos\/. If you\u2019re interested in the background and early prototype, you can find more details in my previous post on Blink for iOS and related work: https:\/\/blogs.igalia.com\/gyuyoung\/2024\/08\/08\/chrome-ios-browser-on-blink\/. [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[4,18,20],"class_list":["post-1031","post","type-post","status-publish","format-standard","hentry","category-igalia-chromium","tag-chromium","tag-ios","tag-tvos"],"_links":{"self":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts\/1031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/comments?post=1031"}],"version-history":[{"count":17,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts\/1031\/revisions"}],"predecessor-version":[{"id":1067,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts\/1031\/revisions\/1067"}],"wp:attachment":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/media?parent=1031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/categories?post=1031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/tags?post=1031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}