The macOS Screen Sharing app has a “High Performance” mode (macOS 15+, Apple silicon only) that feels native when used in-combination with a low-latency link. One of the major downsides is that the application refuses to run a more than 1 high performance session. The limit is understandable for the server component, but why is the client limited? Surely the device is capable of more than 1 video decoding stream.

If you try to open a second session and you get:

To continue, close the active session.

I could not find anyone online documenting a way around the client limit, so here is one such way. The limit is enforced per-process, and not system-wide. So to launch additional high performance sessions, you can simply launch a second instance of the client and then connect to your second remote mac.

open -n -a "Screen Sharing"

Research

The feature’s internal name is “ProMode”. Static analysis of the client (/System/Applications/Utilities/Screen Sharing.app, ScreenSharing.framework, ScreenSharingUI.framework, and ScreenSharingKit.framework) locates the entire gate in the app binary, in a singleton class called SessionControllerManager.

The check is a plain nil-test:

// -[SessionControllerManager hasOpenProModeSession]
return activeProModeSession != nil;

Binary Ninja: -[SessionControllerManager hasOpenProModeSession] returns activeProModeSession != nil

And activeProModeSession simply walks this process’s own window controllers, held in the instance variable _sessionControllers, and returns the first whose view is running the High Performance media stream (isUsingAVCMediaStream):

// -[SessionControllerManager activeProModeSession]
for (group in self->_sessionControllers)
    for (windowController in group)
        if (windowController.sessionView.isUsingAVCMediaStream)
            return windowController;
return nil;

Binary Ninja Pseudo Objective-C: -[SessionControllerManager activeProModeSession] retaining [self sessionControllers] and fast-enumerating this process's window controllers

Binary Ninja Pseudo Objective-C: the inner loop returning the controller when [obj isUsingAVCMediaStream] is true, else nullptr

There is no cross-process state. The gate reads only self->_sessionControllers, an in-memory ivar populated by this instance’s own addSession / addSessionWithURL:…. Since the state is contained to within the process, a second process gets a fresh SessionControllerManager with an empty _sessionControllers, so activeProModeSession is nil, hasOpenProModeSession is false, and the second session connects.

Symbol References

  • SessionControllerManager, activeProModeSession, hasOpenProModeSession, closeOpenProModeSession, openProModeSessionDisplayName, _sessionControllers, +sharedManager
  • SSSession, appWantsProModeInterface, setAppWantsProModeInterface:, doesServerSupportProMode, maxVirtualDisplays
  • SSSessionView, hasOpenProModeSession, isUsingAVCMediaStream, ssSessionWantsProModeInterface:
  • ScreenSharingUI.DisplayConfigurationViewModel, hasOpenProModeSession, maxVirtualDisplays, PromodeDisplayOptionsPickerView
  • Strings: "Cannot add more than one active High Performance session.", "ProMode enabled", "ProModeActive", "High Performance", "To continue, close the active session."
← Back to Blog