Release v2.6

Please feel free to get in touch with feedback and questions via the #pupil channel on Discord :smile:


In v2.6, we are taking a big step towards our modularity goal. We now support custom user pupil detector plugins. This change makes it easier than ever for you to modify the existing pupil detection algorithms or to build your own! You will no longer have to run Pupil Core software from source to get started with your custom pupil detector! Read more about it in our documentation.


Support custom pupil detection plugins - #2033

You can now run your own pupil detection plugins that run in the eye processes. These plugins can be used to implement custom algorithms for extracting pupillometry data from the eye images and feeding it to the rest of the gaze mapping pipeline.

Pupil detection plugins are supported in Pupil Capture, Pupil Player, and Pupil Service. Similar to regular user plugins, custom pupil detection plugins should be placed inside pupil_capture_settings/plugins for Pupil Capture, pupil_player_settings/plugins for Pupil Player, and pupil_service_settings/plugin for Pupil Service. The plugins are automatically loaded when the applications starts.

Read more about it in our documentation.

Support HMD Streaming Source in eye process - #2052

We have added support for using HMD Streaming Source in the eye process. This also adds support for BGR and Gray frame format for HMD streams.

Support Pupil Invisible recording format v1.4 - #2054

This new recording format has been introduced in Pupil Companion 1.0.0. This version provides support for the OnePus 8 phone and Android 11. On the OnePlus 8, eye videos will be h264-encoded.

Bug Fixes

  • Removed import * statements - #2036
  • Fixed typo in circle detector benchmark - #2038
  • Fixed CPU graph and UI refresh performance - #2040, #2041
  • Fixed gaze with negative z-component - #2043
  • Fixed issue when minimizing 3D pupil detector debug window on Windows - #2047
  • Fixed UVC camera auto-selection priority in case of multiple pattern matches - #2051

Developer Notes

Added ability to stop eye process plugins via notifications - #2039

Another small improvement for eye process plugin management in this release is the ability to stop plugins via notifications. This gives better control over the list of plugins running in the eye process.

import zmq
import msgpack

# class name of the plugin to stop
plugin_name = "..."

# create and connect PUB socket to IPC
pub_socket = zmq.Socket(zmq.Context(), zmq.PUB)

for eye_id in (0, 1):
    subject = "stop_eye_plugin"
    topic = "notify." + subject
    payload = {
        'topic': topic
        'subject': subject,
        'target': f"eye{eye_id}",
        'name': plugin_name,

    pub_socket.send_string(topic, flags=zmq.SNDMORE)
    pub_socket.send(msgpack.dumps(payload, use_bin_type=True))

Added requirements.txt file - #2029

We continue to streamline and simplify the installation of Pupil Core dependencies. You can now use the requirements.txt file from the root of the pupil repository to install and update all Python dependencies.

python -m pip install --upgrade pip wheel
pip install -r requirements.txt

To open the RAR-archive on Windows, you will need to use decompression software, e.g. WinRAR.