Poking around the visionOS SDK

Following the release of the very first seed of the Software Development Kit for visionOS, here’s a gathering of a few things I’ve found while quickly poking around the visionOS 1.0 Beta SDK, based on my understandings of how Apple’s systems are developed and work.

TL;DR: what’s below may be inaccurate, misworded or blatantly wrong. Don’t hesitate to correct me.

Software

Based on iOS

The Simulator Runtime (and the recoveryOS build for the headset) makes it pretty clear: visionOS was named xrOS during development and is based on iOS.

Unlike iPhone OS, based on CoreOS components (think XNU and launchd) borrowed from Darwin and Mac OS X to form a new operating system of its own, visionOS is iOS but from another build train, like watchOS (for Apple Watch), tvOS (for Apple TV/HomePod), bridgeOS (for T1/T2 Security chips), darwinOS (for Apple Studio Display) and recoveryOS (standalone wireless recovery environment for at least Apple Watch and Apple TV).

visionOS 1.0 Beta has the build number 21N5165g. Let’s dive into it:

21N5165g1

  • 21N is the build train identifier, named Borealis. iOS 17’s build train identifier is 21A (named Dawn), indicating that visionOS 1.0 is based on iOS 17.0;
  • 5 is the build variant. 5 means it’s a Beta build. Those builds are from dedicated build trains with the “Seed” suffix (visionOS 1.0 Beta is BorealisSeed and iOS 17.0 Beta is DawnSeed). Internal development happens in non-Seed build trains and only stuff that’s been announced goes to Seed builds for distribution outside Apple to developers, AppleSeed members and public beta testers;
  • 165 is the increment number. visionOS 1.0 Beta has been compiled 164 times before this build. Newer builds have a higher increment.

This isn’t a new approach: watchOS, tvOS, bridgeOS, darwinOS and recoveryOS are all developed the same way: derived from iOS and including device-specific software and firmware when building, like Carousel.app for watchOS and HeadBoard.app for tvOS (more on that later).

iOS became the AppleOS that gets forked whenever a new product category comes out, with macOS being the caring grandfather that oversees it all.

Because visionOS is from iOS, it shares its CoreOS foundations with the rest of the family: XNU says hello, launchd is there, daemons are more or less the same and usual frameworks (public and private) are present as well.

Dedicated GUI

Unlike Mac OS X which had several processes in charge of the GUI (WindowServer, LoginWindow, Finder.app, Dock.app), iPhone OS had one: SpringBoard.app.
Each iOS derivative has its own “Home Screen” app: watchOS has Carousel.app, tvOS has HeadBoard.app.

For visionOS, Apple made SurfBoard.app. Located at the usual place (/System/Library/CoreServices/SurfBoard.app), it is launched at boot by launchd as the “EmbeddedHomeScreen” process running with the mobile user privileges, present since iPhone OS 2 (in iPhone OS 1, SpringBoard.app was running with root privileges. Not a good security practice).

Interestingly, SurfBoard.app‘s main executable, SurfBoard, is just a wrapper. All the logic is in the SurfBoardFramework dynamic library in SurfBoardFramework.framework, located inside the app bundle and not in /System/Library/PrivateFrameworks/.

As a replacement to SpringBoard.app, SurfBoard.app handles the usual Mach services that are usually devoted to SpringBoard.app, like PurpleSystemAppPort. It also listens on new Mach ports for what I call the “Reality subsystem”, like com.apple.realitysystemsupport.hid_server or com.apple.surfboard.launcherservice.

Unlike SpringBoard.app which was a monolith for years, SurfBoard.app delegates a lot of UI tasks to other “Reality subsystem” apps and bundles, with self-explanatory names:

  • /Applications/RealityBreakthrough.app
  • /Applications/RealityChrome.app
  • /Applications/RealityControlCenter.app
  • /Applications/RealityCoverSheet.app
  • /Applications/RealityEnvironment.app
  • /Applications/RealityGuestSetup.app
  • /Applications/RealityHUD.app
  • /Applications/RealityKeyboard.app
  • /Applications/RealityLauncher.app
  • /Applications/RealityNotifications.app
  • /System/Library/HUDItems/Bundles/ControlCenterHUDItem.bundle
  • /System/Library/HUDItems/Bundles/EnvironmentHUDItem.bundle
  • /System/Library/HUDItems/Bundles/HomeHUDItem.bundle
  • /System/Library/HUDItems/Bundles/NotificationCenterHUDItem.bundle
  • /System/Library/HUDItems/Bundles/SearchHUDItemProvider.bundle
  • /System/Library/HUDItems/Bundles/SiriHUD.bundle

And a daemon called wakeboardd handles compositing:

Also present a lot are “Muse“, “Wolf” and “TDG” (for Technology Development Group) prefixed bits.

Wolf was reported to be the whole xrOS platform codename (like Aspen was to iPhone OS), and based on bundles and frameworks like MediaControlsModuleWolf.bundle and FaceTimeSupportWolf.framework, this is clearly the case.

My guess: these prefixes (along with the N301 and xrOS suffixes, more on that later) were used to strip visionOS and Vision Pro-related bits for builds seeded to people who were unaware of the Vision Pro’s existence, and outside Apple.

For instance, Setup.app (codenamed PurpleBuddy) is replaced by MuseBuddyApp.app. Since Purple was the codename of the iPhone project, it was only fitting that its replacement should bear a visionOS codename (and the bundle identifier is com.apple.tdg.systemapps.MuseBuddyApp. 2-in-1).

Another example: visionOS-specific Control Center modules are in the /System/Library/ControlCenter/Bundles/Muse/ directory (ModuleAllowedList.plist acts as a whitelist of modules that can be loaded by Control Center, referencing an internal module identified by com.apple.TDGPerfTools.controlcenter.PerformanceTraceModule).

Hardware

Board

The board config number is N301AP, confirming that the rumors around the N301 codename were true.

Model number

The RegulatoryInfo image file seems to indicate that Apple Vision Pro will have the model number A2117.

Model identifier

The model identifier is RealityDevice14,1. My guess: Apple uses their new naming scheme: [ProductType][SoC],[X].

For instance, (some) Macs with M1 are Mac13,x and all Macs with M2 are Mac14,x. Since Apple Vision Pro is built around the M2 SoC, it makes sense that the base model identifier is RealityDevice14,x.

Limitations of visionOS 1.0 Beta / Apple Vision Pro dev kits

In the visionOS 1.0 Beta Release Notes, and in a typical Apple fashion when it comes to writing release notes for Developer seeds, there are a few elements about the visionOS 1.0 Beta (not the SDK) and Apple Vision Pro:

  • “visionOS automatically checks if display adjustment is required the first time you put on Apple Vision Pro. Press and hold the Digital Crown until you see a green check mark. If you’re unable to complete adjustment, contact your WWDR representative.[…]”
  • “To Force Quit an app, hold both the Digital Crown and top button for 2 seconds. Select the desired app from the list which appears, then select the Force Quit button.”
  • “Ensure only one prescription ACC is visible during prescription lens enrollment. If the enrolled prescription doesn’t match, delete the enrollment and re-enroll.”
  • “Optic ID is limited to two Rx enrollments and one non-Rx enrollment.”
  • “Selecting incorrect Zeiss Optical Inserts might cause eye enrollment to fail.”
  • “Travel Mode is optimized for a stationary experience. If you activate Travel Mode in Control Center and start walking, you might experience unexpected behavior.”

Final word

Kudos to the Technology Development Group and all the involved Apple folks! I suppose that finally showing this to the entire world has to be an exhilarating feeling and it’s a wonderful new platform you’re putting out here. Can’t wait to get my hands on a Vision Pro when it’ll be available in France one day.


1 I’ve still not figured out what appended letters (g in this case) mean. Any ideas?

Apple Vision Pro images are ©Apple, Inc.

By Pierre Blazquez

I mess with computers, drink too much coffee and listen to music at max volume.