A Python utility for displaying system stats and GIF animations on the OLED screen of supported SteelSeries keyboards. Forked from steelseries-oled.
- Apex 7
- Apex 7 TKL
- Apex Pro
- Apex 5
pip install -r requirements.txtConfigure which sensors to show in config.yaml, then run:
python3 ss-display.pyEnabled sensors are grouped into pages of 3 (font size 12) or 4 (font size 10) lines and rotate automatically on the configured delay. An image or GIF can also be added as a rotating page — W.gif is included as an example.
All options live in config.yaml.
| Key | Description | Default |
|---|---|---|
font |
TrueType font file (must be in the same directory) | SpaceMono-Regular.ttf |
size |
Font size. 12 fits 3 lines, 10 fits 4 lines | 12 |
delay |
Seconds to show each page before rotating | 2 |
image |
Path to an image or GIF to display as a rotating page (PNG, JPEG, GIF, etc.) | (blank) |
Set any sensor to true to enable it. Sensors are displayed in the order listed.
| Key | Description |
|---|---|
cpu_percent |
CPU utilisation % |
load1 |
1-minute load average |
load5 |
5-minute load average |
load15 |
15-minute load average |
core_temp |
CPU core temperature (°C) |
gpu_temp |
GPU temperature (°C) |
cpu_freq |
Current CPU frequency (MHz) |
cpu_max |
Maximum CPU frequency (MHz) |
cpu_count |
CPU core count |
mem_used |
Memory used (MiB) |
mem_free |
Memory free (MiB) |
mem_total |
Total memory (MiB) |
mem_used_percent |
Memory used % |
swap |
Swap used (MiB) |
swap_percent |
Swap used % |
battery |
Battery level and charge state (e.g. 85%+) |
disk_usage |
Usage % for each local mounted filesystem (ext2/3/4, btrfs, xfs, zfs, ntfs, etc.) |
fan_speeds |
RPM for all available fans |
external_ip |
External IP address |
Auto-detected for Intel (coretemp), AMD via k10temp (prefers Tdie over Tctl to avoid the +27°C offset on early Ryzen), and AMD via the zenpower driver.
| GPU | Status |
|---|---|
| NVIDIA | Tested — via GPUtil |
| Intel Xe / Arc | Tested — via xe sensor |
| AMD | Untested — implemented based on documented amdgpu sensor labels |
AMD GPU support has not been tested against real hardware. If gpu_temp shows nothing or wrong values on your AMD GPU, please open an issue and include the output of:
python3 -c "import psutil; [print(k, [(e.label, e.current) for e in v]) for k,v in psutil.sensors_temperatures().items()]"A sample systemd user service is included. Update WorkingDirectory to match your install path:
cp ss-display.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now ss-displayA sample .desktop file is included. Update the Exec path to match your install location, then copy it to the appropriate directory:
# autostart on login
cp ss-display.desktop ~/.config/autostart/
# or add to the app launcher
cp ss-display.desktop ~/.local/share/applications/- Device config overrides (
vid,pid,interface,report_id,width,height) under adevice:section inconfig.yamlto support non-SteelSeries OLED keyboards; SteelSeries auto-detection is unchanged when these are omitted
- Screen rotation delay increased from 2s to 5s
- Fan sensors now skip headers with no fan attached (RPM == 0) at startup
- External IP lookup switched from HTTP to HTTPS (
api.ipify.org) to prevent MITM on untrusted networks - Added 5-second timeout to external IP request so a slow or unreachable server can't freeze the display
- CPU temperature auto-detection for AMD systems:
k10tempdriver (prefersTdieoverTctlto avoid the +27°C offset on early Ryzen) andzenpowerdriver - GPU temperature support for AMD (
amdgpusensor,edge/junctionlabels) and Intel Xe/Arc (xesensor,pkglabel), alongside existing NVIDIA support via GPUtil
- Config format converted from INI (
config.ini) to YAML (config.yaml); sensor keys are nowsnake_case - Sensor polling optimized: related psutil calls cached per tick to avoid redundant syscalls when multiple sensors share the same data source
- External IP result cached for 5 minutes (was fetched every tick)
core_tempno longer crashes on AMD systemscpu_freqandcpu_maxno longer crash on systems wherepsutil.cpu_freq()returnsNone- Disk usage sensor guards against filesystems unmounted after startup
- Config lookups hardened against blank YAML values
- Disk usage, battery, and fan speed sensors
- Image and GIF support as a rotating display page
- Config-driven sensor selection
- Sample systemd user service unit and
.desktopfile requirements.txt
- Refactored into
ss-display.py+functions.py - Paths use
realpath-anchored resolution instead ofchdir
Upstream (forked from steelseries-oled)
- Apex Pro and Apex 7 TKL support
- SIGTERM handling
- Static image display and screen blanking
