Announcing Juno 2.0

May 7, 2024

A Bento-style promotional image for Juno 2.0, a YouTube app for visionOS, highlighting its new features. The features include 360° and 180° video with 6K Metal upscaling, improved voice search, end card selection, faster performance, better video compatibility, new UI, streams and live videos, Siri control, watch history sync, playlists, smart window resizing, remember settings, and bug fixes

Juno’s been a really fun project to build, and it’s been so great hearing how other people have been enjoying Juno since its launch, as well as providing awesome feedback and input to improve it.

Today I’m releasing Juno 2.0, which incorporates a ton of that community feedback, and truly brings the app to the next level through extensive improvements and new features. Using it over the last little while I have had so many moments where I catch myself smiling. Browsing and watching YouTube on visionOS through Juno is honestly just so fun, immersive, and downright futuristic, and I genuinely think the best way to watch your favorite videos.

You can download Juno for YouTube 2.0 for just a fiver (and it’s a free update for existing customers), and unlock an amazing visionOS experience for YouTube.

I think this version really lives up to the 2.0 moniker, so let’s get into all the improvements!

Immersive 360 and 180 degree video (with a Metal twist!)

A woman with an Apple Vision Pro on staring out at a savannah with a lion

You can now watch (what I would imagine to be) the internet’s largest source of 360° and 180° immersive video with Juno. Simply tap on the video from YouTube, and Juno will offers to open it in an immersive space, where the video will fully surround you as you watch it. You can soar through volcanoes, experience tours of incredible foreign lands, dive underwater, skydive, pretty much whatever you can imagine, it’s probably out there and now watchable in Juno for visionOS.

The twist is, Juno even takes this a step further, and leverages Apple’s Metal engine to perform advanced AI upscaling and take the existing limitation of 4K video, and upscale it to 6K. This is the same technology that games like No Man’s Sky and Resident Evil Village have recently used to unlock incredible performance on Apple silicon, and with Juno it makes video feel even sharper and more realistic, with over twice the pixels versus 4K.

From a technical perspective, this was a TON of work. As mentioned in previous blog posts, Juno leverages the YouTube website, as Google/YouTube do not give an (official) way to access video feeds directly (as doing so would allow you to circumvent ads and make them angry).

With just the website, and no direct access to the video, creating an immersive experience is incredibly challenging, but using Metal and impressive GPU on the Vision Pro, Juno essentially takes a series of rapid snapshots of the web browser and stitches them together in a video feed, running each frame through Apple’s MetalFX machine learning upscaling engine, and then projecting that frame onto a sphere that surrounds the user.

The result is truly incredible and I’ve seen some really mind-blowing videos. To quote a recent email I got from TestFlight, “I don’t know how you did it, this is ****ing incredible”.

It’s not perfect (it’s capped at 30 fps, which is the normal frame rate for VR videos on YouTube), and there’s bound to be some bugs (please report!). Metal AI upscaling also does not work with all videos (it can introduce some lag for some very “busy” videos), so you can turn it on or off at will in the player.

As mentioned in the last post, Apple’s M2 chip does not have a hardware decoder for the AV1 video codec that YouTube uses for 8K videos so it’s highly likely true 8K YouTube videos will be a ways away for the Vision Pro, and Juno bridges this gap nicely by offering all content in smart-upscaled 6K (which also covers the vast majority of immersive videos that don’t even have an 8K version uploaded).

I do want to take a chance to massively thank everyone who has answered questions on social media or Discord about Metal, RealityKit, and more, without you this never would have been possible. I want to say an extra big thanks to Khaos Tian, Arthur Schiller, and Finn Voorhees, who I truly talked the ears off of, and as a result there’s a findable easter egg in Juno now where the immersive theater is named the KSV Immersive Theater.

New UI

Juno's new UI with native navigation bar, tab bar, and search bar floating in a hotel room

I really wanted to have an app for watching YouTube on visionOS available on the platform for day one, and I put a lot of hours into making that happen. I was admittedly a bit up against the clock however, so I’m glad with this update I was able to take some extra time to really go over the UI with a fine-toothed comb and make some nice improvements, and now Juno feels even more like a beautiful, native visionOS app (even if it’s basically just a very complex browser extension).

With 2.0 Juno now enjoys a beautiful new tab bar, which loads content much faster and keeps them in memory. There’s also a new, beautiful navigation bar with a progressive blur to the content behind it, with a native search bar that allows you to just look at the microphone and talk to quickly search YouTube. It feels awesome, and is in many ways what I always wanted Juno to be from the outset.

New video engine: better video compatibility, and watch history!

Juno 1.0 leveraged Apollo’s code that used the YouTube embed player to play back content. This allowed me to ship quickly, but at the same time had issues such as some video creators disabling playback in the embed player (which would cause Juno to fallback to the website), and other ramifications like not marking that you watched that video in your history.

Juno 2.0 now just uses the website as its video component, as it does with the rest of the app. With that, more videos are able to play back, videos are correctly added to your watch history, and also just greatly simplifies Juno, as Juno is now simply loading the YouTube video URL as a web browser would, and just applying custom CSS and interacting with it through JavaScript to make it feel at home on visionOS.

(And yes, if you’re curious, Juno still does not block ads for reasons of not angering Google, but as it’s just using the website if you have YouTube Premium you will not see any ads in Juno.)

Back button

Yeah, this gets its own category, because it was surprisingly really, really hard! Back in 2004 when both the world and websites were much simpler, you would click a link on a website, and the browser would load a new webpage. Now we got all fancy with JavaScript and whatnot, and websites like YouTube (for good reason, it makes things feel faster), instead of loading a whole new webpage each click, normally just swap out the contents of the current website with JavaScript, and then update the URL to indicate the change.

Cool! That’s great! I’m so happy for you! But that makes a back button a lot more annoying, because now web browsers get confused a lot when you hit back (you didn’t really change a page), and often the browser will update the URL but the page contents will stay the same, and you’re just staring at your screen confused. Twitter, Threads and Mastodon have told me I’m not imagining things and that does happen a lot to other folks.

So Juno has a back button, but also sprinkles some special YouTube magic sauce (do you sprinkle sauce? maybe flakes) where it attempts to detect the web browser being confused, by checking if the HTML of the current webpage is a reasonable match for the current URL. If they don’t match, it means the web browser got confused and just updated the URL without updating the actual page contents, and Juno does a full refresh of the webpage which forces the web browser to refetch the proper contents for the current URL. The system doesn’t have to step in that often (maybe 10% of the time), but when it does, it’s very helpful and I could not ship a half–working back button.

Playlist support

I suppose “playlist support” covers two new features! The first, is that if you select a video from a playlist, for instance a video series a YouTuber made, it will automatically play the next video in the series upon each video ending.

The second aspect would be the new playlists page, rather than just a text menu like in Juno 1.0, you now get access to the full YouTube website playlist view, with rich thumbnails!

Better window resizing

Juno’s always been a pretty smart cookie about window sizing, and automatically adapts the window to the aspect ratio of the video so you don’t get any black bars. But with this update, Juno will also properly manage the size of the window. So if you want to make your window even bigger, Juno will remember that approximate size and adapt the aspect ratio accordingly, so you can keep your ideal video watching experience perfectly intact across a variety of videos.

Juno remembers

A video about blueberry pie in Juno with the playback speed controls visible

Now Juno is much better at remembering your settings between subsequent video watches. In addition to the window sizing mentioned above, Juno will remember features like captions, playback rate, and more.

Select end cards/auto-play

There are two kinds of YouTube users, those who leave “auto-play” enabled (so YouTube will just play the next recommended video automatically after you finish your current one), and folks who have that turned off (YouTube will show a grid of video recommendations to watch next). Juno loves everyone and now supports both of those, so if you have it enabled on the website, Juno will auto-play the next video automatically with its countdown, and if you have that disabled, you can pick from YouTube’s recommended next videos.

Siri integration

This is a really handy one and was very highly requested (for good reason). Now you can just say “Siri, pause”, “Siri, playback speed 2 times”, “Siri jump to 5 minutes and 30 seconds”, etc. and Juno will listen accordingly so you don’t even have to pick up a finger!

Time-linking

If you select a video on the website that’s linked to a specific time (say, 2 minutes and 28 seconds), Juno will incorporate that instead of just playing from the beginning. Same if you drag and drop a YouTube link onto Juno from a friend. On the flip side, if you share a YouTube URL from Juno, it will now embed the current time into the URL so your friend (or enemy? idk) that receives the link doesn’t have to guess what part of the video you were talking about (or worse, manually scrub to it).

Options menu integration

You can now properly interact with the YouTube options menus (those vertical ••• menus, for the unaware), so if you want to add a video to a playlist, remove something from your watch history, or anything like that, you’re now easily able to!

Open in Safari

The Share menu for a video (in addition to fixing a potential crash that could occur), now allows you to quickly open a YouTube video in Safari if you so choose, which can be a great way to access features of YouTube that Juno might not offer, like reading comments, for instance.

Bug fixes

Lots of little bug fixes across the board that should make everything operate even smoother. Captions should work more reliably (and tell you in cases where they’re unavailable), drag and drop as well as sharing should no longer crash in weird cases, the double-tap to go forward/back 10 seconds should be faster, seeking should be smoother, among many others!

Misc: disabling spatial audio

A common request has been to be able to disable spatial audio (right now visionOS makes Juno’s audio feel like it’s coming from the window itself, so if it’s beside you, the audio will feel beside you). Some folks don’t love this and wish it just sounded like normal audio. Unfortunately Apple doesn’t expose an API to control this for web views, BUT iOS does have a kinda hidden way to override it. If you bring up the system Control Center and long-press the volume slider, you can disable it there. So that’s a good solution if you’re looking for a way!

Lastly: answering Google/YouTube’s issues with Juno

I’ve said from the initial launch, Juno is built as a web-wrapper for YouTube, akin to a browser extension, and purposefully built with full respect for the YouTube website and experience, and as a result does not block ads in any capacity, nor does it introduce extra functionality like downloading videos offline that could facilitate that. Further, Juno doesn’t even use any YouTube APIs, as it has no need to: it just wraps the website, and uses CSS and JavaScript to style the website and functionality more in line with visionOS. This is in contrast to other third-party tools that for instance scrape the YouTube website for applicable video URLs and use those directly, or those that integrate ad-blocking functionality.

An email from YouTube Legal about Juno, the contents of which are linked below.

In April, YouTube announced it would be cracking down specifically on ad-blocking third-party apps, and weirdly, Juno got an email at the end of April from YouTube Legal that voiced some concerns. You can view the full contents of their email here: https://christianselig.com/juno-youtube-email-april-26-24.txt

The short of it is that, while no issues with ad-blocking were presented, they did take issue with a few areas, firstly that Juno is in violation of the YouTube API Terms of Service, and secondly that Juno alludes to YouTube trademarks and iconography. Both of these issues were very puzzling.

For the first issue, as I mentioned, Juno makes no use of the YouTube API so it’s unclear to me how it could be in violation of it. Juno operates in much the same way a browser extension would through CSS and JavaScript. Google’s own Chrome both has native support for browser extensions, and even has native features that customize the styling and experience of webpages. They also mentioned they did not like that Juno uses the embed player, despite Google themselves having a library showing this as the preferred way to integrate YouTube videos into apps.

Secondly, for iconography and trademarks, I can only assume YouTube is referring to the YouTube logo present on the YouTube.com homepage that Juno loads. Obviously, as I’m just loading a website, I am not putting that there. For the name, “Juno for YouTube”, YouTube has branding guidelines that specifically permit this: “For example, you cannot call your application “YouTube for Kids” or “YouTube Education”. However, you may reference the fact that your app is for YouTube or works with YouTube by stating that it is a “great app for YouTube” or using other similar language”.

Like I said, from the get-go I’ve wanted be just a well-behaved visionOS wrapper for the website, so in the interest of making YouTube happy, back in April I responded to Google that as Juno does not use any YouTube APIs, I do not see how it could be violating them, however I would be putting an update out to attempt to address concerns. This is that update, and I switched from the embed player to just using styling the website player, I manually removed the YouTube logo from the homepage, and I added “Unofficial” to the subtitle and description of Juno on the App Store.

Now that this update is out, hopefully this appeases Google, as they have also (as of a few days ago) filed a complaint with the App Store directly. I’ll obviously push back, as I believe Juno is just getting caught up in the crosshairs of Google’s targetting of apps that do have ad-blocking, and an app that fundamentally themes a website is nothing new, novel, or insidious.

But, if you’re hoping for a bunch of drama to spin out of this (akin to last year with Reddit), I’m sorry to say I’m not looking to go down that route again. Juno has been a ton of fun to build, a ton of fun to use, and in my opinion a great benefit to both the Vision Pro platform as well as YouTube users, but it’s fundamentally a fun hobby project for me, and if it comes down to fighting a drawn out battle against a giant like Google again… well, that no longer sounds like fun and I’ll happily let Google win, haha. Worst case scenario I’ve had a ton of fun building this, and I got to get my feet wet with visionOS, so it’s all good!

That being said, if Juno does disappear from sale from the App Store, I don’t see any reason to believe that it will cease to work for existing users as it just operates on the website, unless YouTube/Google dramatically rework the website. Again, this wouldn’t seem beneficial to them as Juno is just the website and shows all ads and whatnot. Also this is genuinely not a coy way of saying to get the app before it goes away, it may cease to work and I wouldn’t want anyone buying it going into it with a false belief that it will work forever. But if I had to guess it will work.

Thank you! ❤️

I really hope you enjoy the Juno 2.0 update, I had a lot of fun building it and I’d love to know what you think. If you haven’t checked out Juno yet, you can download it here (if you think you’re going to forget, you can also purchase it from your iPhone or iPad). And if you have checked out Juno, you’re awesome, no doubt very well-read, have incredible taste, and I thank you!