Subsystems

August 21, 2026 · View on GitHub

This documentation refers to individual protocol features, it links to the implementation and technical documentation for each subsystem.

Each subsystem should be using its own prefix for capabilities and packet types. (most already do)

Most modules are optional, see security considerations.

See the display server data inventory for the non-framebuffer data that can be retrieved from display servers and associated desktop-session services.

Concepts

Subsystems are independently loaded feature modules with matching client and server-side responsibilities.

  • Client Module: feature implementation loaded by the client, it interfaces with the corresponding "Client Connection Module" on the server side
  • Client Connection Module: for each connection with a client, the server will instantiate a handler
  • Server Module: feature implemented by the server, it may interact with multiple "Client Connection Modules"

A client or server may choose to completely disable a subsystem.
When this is the case, it will not load the module into memory and will not know how to handle requests for this feature.

Most subsystems are independent of each other. The diagram below shows the dependencies enforced at subsystem load time (see xpra/server/features.py). Solid arrows mark a hard requirement — the dependent subsystem cannot be enabled unless its parent is also enabled. Dashed arrows mark soft or alternative dependencies — the subsystem can use the parent if it is available, or has an alternative code path on some platforms.

Dependency graph

Dependency graph showing Xpra subsystem groups and their hard or soft dependencies

The SVG is generated from the Graphviz source; click the diagram to open it at full size.

View original Mermaid source
graph LR
    classDef core fill:#fde,stroke:#a04,stroke-width:2px,color:#000;
    classDef group fill:#eef,stroke:#446,color:#000;

    Core["Server core<br/>(sockets, auth, dispatch)"]:::core

    subgraph Backend["Display backend (mutually exclusive)"]
        X11[x11]
        Wayland[wayland]
    end

    subgraph Surface["Display surface"]
        Window[window]
        Keyboard[keyboard]
        Pointer[pointer]
        Display[display]
        Cursor[cursor]
        OpenGL[opengl]
        Bell[bell]
        BellSrv[bell server]
    end
    Window --> Display
    Keyboard --> Display
    Pointer --> Display
    Display --> Cursor
    Display --> OpenGL
    Display --> Bell
    Bell --> BellSrv

    subgraph Media["Media pipeline"]
        GStreamer[gstreamer]
        Audio[audio]
        Pulseaudio[pulseaudio]
        AVSync[av_sync]
        Webcam[webcam]
        Encoding[encoding]
    end
    GStreamer --> Audio
    Audio --> Pulseaudio
    Audio --> AVSync
    GStreamer -.-> Webcam
    GStreamer -.-> Encoding

    subgraph X11Ext["X11-only extensions"]
        ICC[icc]
        SysTray[systray]
    end
    X11 --> ICC
    Display --> ICC
    X11 --> SysTray
    X11 --> BellSrv
    Wayland --> BellSrv

    subgraph UI["UI / lifecycle"]
        GTK[gtk]
        Tray[tray]
        Watcher[watcher]
        Power[power]
        Suspend[suspend]
        Idle[idle]
        Debug[debug]
        Splash[splash]
    end
    GTK --> Tray
    SysTray -.-> Tray

    subgraph Net["Network / transport"]
        SSL[ssl]
        SSH[ssh]
        HTTP[http]
        MDNS[mdns]
        RFB[rfb]
        Control[control]
        SSHAgent[ssh_agent]
    end
    SSL -.-> HTTP
    SSH --> SSHAgent

    subgraph Session["Session features"]
        Clipboard[clipboard]
        FileT[file]
        Printer[printer]
        Notification[notification]
        Command[command]
        Logging[logging]
        Ping[ping]
        Bandwidth[bandwidth]
        Shell[shell]
        MMap[mmap]
        DBus[dbus]
        Encryption[encryption]
        Sharing[sharing]
        ClientSession[client_session]
        Settings[settings]
    end
    Printer --> FileT
    DBus --> Notification
    DBus -.-> Tray

    Core --> Backend
    Core --> Surface
    Core --> Media
    Core --> UI
    Core --> Net
    Core --> Session

    class Backend,Surface,Media,X11Ext,UI,Net,Session group;

Graph notes

  • display is auto-enabled when any of window, keyboard or pointer is enabled — it is the union of those features rather than a prerequisite.
  • notification requires dbus on Linux, but has native code paths on Windows and macOS (shown as dashed via DBus).
  • tray requires gtk and (for the system tray icon on X11) the systray extension.
  • The ICC, bell server and systray subsystems are loaded only on X11 sessions, and require both x11 and the corresponding feature flag.
  • pulseaudio and av_sync are strict refinements of audio, which itself requires gstreamer.

Protocol subsystems

These subsystems involve communication between client and server.

Server-only subsystems

These subsystems handle server-side infrastructure and have no corresponding client module or client connection module.

SubsystemServer ModuleUser Documentation
Authauthauthentication
ClientSessionclient_sessionn/a
Controlcontroln/a
Daemondaemonn/a
DBUSdbusn/a
Debugdebugn/a
DRMdrmn/a
GTKgtkn/a
HTTPhttpn/a
IDidn/a
Idleidlen/a
MDNSmdnsmulticast DNS
OpenGLopenglOpenGL usage
Platformplatformn/a
Processprocessn/a
PulseAudiopulseaudioaudio feature
RFBrfbn/a
SessionFilessessionfilesn/a
Settingssettingsn/a
Shutdownshutdownn/a
Splashsplashn/a
Suspendsuspendn/a
Versionversionn/a
Watcherwatchern/a
Xvfbxvfbn/a