Real-time AI upscaler for any Linux window using CuNNy
Project description
Real‑Time Upscaler for Linux
A real‑time AI upscaler for any application window on GNU/Linux. It uses CuNNy neural networks to perform 2x (or 4x) upscaling, then scales the result to full screen while preserving aspect ratio. Mouse clicks and motion are automatically forwarded to the original window.
Now with full XWayland support – works seamlessly under Wayland compositors!
Results at 400% magnification
Features
- AI‑Powered Upscaling – Uses the CuNNy (Convolutional upscaling Neural Network) models, trained specifically for high‑quality 2x upscaling of visual novels and illustrations.
- Complete Model Selection – Choose from 9 variants, offering a range of quality/performance trade‑offs:
8x32– Highest quality, slowest.4x324x244x164x123x12fast– Default. Recommended for slow machines.fasterveryfast– Fastest option, lowest quality.
- Attach to Any Window – Either grab the currently active window, select from visible windows or launch a new program and capture its window automatically.
- Flexible Output Geometry – Control the overlay size, scaling mode, offset and borders.
- Input Forwarding – Click, move, and drag on the upscaled image as if interacting directly with the original window.
- Hardware Accelerated – Vulkan compute (Compushady) works on NVIDIA, AMD, and Intel GPUs.
- XWayland Compatible – Runs under Wayland compositors by automatically forcing X11 platform for Qt.
- Low Overhead – Final scaling pass uses hardware Lanczos2 filtering.
- Global Hotkeys & On‑Screen Display – Switch models, take lossless screenshots and more using keyboard shortcuts.
Requirements
- GNU/Linux (X11 or Wayland with XWayland)
- Vulkan-capable GPU (NVIDIA, AMD, Intel)
- Vulkan drivers (
libvulkan-dev) - X11 development libraries (
libx11-dev) - X C Binding headers (
libxcb-dev) - Python 3.8 – 3.13
Python 3.14 compatibility: Currently not supported due to a low‑level Vulkan backend issue. Please use a Python ≤ 3.13 virtual environment if you have Python 3.14 installed. See issue #1 for details.
Installation
1. System dependencies
Debian / Ubuntu / Linux Mint
sudo apt update
sudo apt install libvulkan-dev libx11-dev libxcb-render0-dev
Fedora / RHEL / CentOS
sudo dnf install vulkan-loader-devel libX11-devel libxcb-devel
Arch Linux
sudo pacman -S vulkan-devel libx11 libxcb
openSUSE
sudo zypper install vulkan-devel libX11-devel libxcb-devel
Alpine Linux
sudo apk add vulkan-headers libx11-dev libxcb-dev
2. Python package
Install with pipx (recommended)
pipx install linux-rt-upscaler
Or with regular pip (inside a virtual environment is advised)
pip install linux-rt-upscaler
Or install from source
# Install additional system dependencies for C compilation
sudo apt install gcc make
# Clone the repository
git clone https://github.com/baronsmv/linux-rt-upscaler.git
cd linux-rt-upscaler
# Install the dependencies and the package in development mode
pip install -e .
Usage
After installation, the upscale command will be available globally:
# Upscale the currently active window
upscale
# Interactively select from visible windows
upscale -s
# Run a command and upscale its window
upscale <command>
# Choose a specific model (examples)
upscale -m 8x32 # Highest quality, slowest
upscale -m 4x24 # A balanced option
upscale -m veryfast # Maximum performance
# Perform 4x upscaling (two 2x passes)
upscale -2
# Set a custom overlay geometry (50% size, fitted)
upscale -o 50%
# Crop 100 pixels from top and left, then upscale
upscale --crop-top 100 --crop-left 100
# Shift the overlay 100 pixels right and 50 down
upscale --offset-x 100 --offset-y 50
For a full list of options and examples:
upscale --help
Controls
| Shortcut | Action |
|---|---|
Alt+Shift+S |
Toggle overlay visibility / pause processing |
Alt+Shift+M |
Switch to the next upscaling model |
Alt+Shift+G |
Cycle output geometry (fit → stretch → cover) |
Alt+Shift+P |
Take a lossless screenshot (--screenshot-dir DIR defines the location) |
All hotkeys can be customised in the configuration file.
- Exit:
Ctrl+Cin the terminal.
Profiles
You can define named configuration profiles in your YAML config file. Profiles let you quickly switch settings for different games or applications without typing long command lines each time.
Create a config file (e.g., ~/.config/linux-rt-upscaler/config.yaml) and add a top‑level profiles key. Each profile is a dictionary with an optional match section and an options section.
If no profile is selected manually, the program checks all profiles that have a match section against the title of the target window. If a profile matches (any match criterion is sufficient), its options are applied automatically.
# General defaults (lowest priority)
model: fast
select: false
profiles:
game:
match:
title: "Danganronpa" # Exact match (case-insensitive)
title_contains: "ronp" # Or substring match
title_regex: "Dangan.*" # Or regular expression
options:
model: 4x24
double_upscale: true
A more detailed example is included here.
How It Works
- Window Selection – Uses X11 to find the target window by PID or WM_CLASS.
- Capture – Grabs the window's pixels using a fast custom C library.
- AI Upscaling – CuNNy compute shaders (written in HLSL, compiled via Compushady) produce a 2x (or 4x) larger image.
- Aspect‑Preserving Scaling – A lightweight Lanczos2 compute shader scales the upscaled image to fill the monitor, adding black bars to maintain the original aspect ratio.
- Display – The result is rendered in a transparent overlay window that bypasses the window manager (so it always stays on top).
- Input Forwarding – Mouse events are transformed using the scaling ratios and sent to the original window via
XSendEvent.
Future Plans
- Standalone GUI application – Create a windowed app interface for easier management.
- Addition of more models – Parse and include other models and shaders.
- Native Wayland support – Support pure Wayland windows without XWayland.
Known Issues
Mouse forwarding may not work with Wine, Proton <10 and other applications
Synthetic mouse events (clicks, motion, wheel) sent by the overlay are ignored by:
- Wine and Proton versions older than 10.0 (Proton 10 works correctly).
- Certain native applications like Firefox.
For more details, see issue #7.
Motivation
While real-time upscaling tools like Magpie and Lossless Scaling remain Windows-exclusive, projects such as lsfg-vk are successfully bringing their frame generation capabilities to Linux.
This project tackles the other half of the equation: AI-powered upscaling to deliver a native solution Linux has been missing, an experience similar to Gamescope that applies intelligent upscaling (similar to Anime4K) to any application.
Acknowledgments
This project stands on the shoulders of several open‑source works:
- L65536 – For the original RealTimeSuperResolutionScreenUpscalerforLinux, which demonstrated the feasibility of real‑time CuNNy upscaling on Linux. This project extends that foundation with full‑screen scaling, accurate input forwarding, and support for all CuNNy NVL models and GPU vendors.
- funnyplanter – For CuNNy, the neural network upscaling models, especially the Magpie NVL variants trained for visual novel content.
- Compushady – Python library for GPU compute (Vulkan backend).
- screeninfo – Python library to fetch location and size of physical screens.
- PySide6 – Qt bindings used for the overlay window.
- python‑xlib – X11 client library for window management and input forwarding.
- xcffib – XCB binding for Python.
- pyewmh – Query and control of window manager.
- psutil – Library for retrieving information on running processes.
- Pillow – The Python Imaging Library
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file linux_rt_upscaler-0.2.9.post1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.
File metadata
- Download URL: linux_rt_upscaler-0.2.9.post1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- Upload date:
- Size: 760.8 kB
- Tags: CPython 3.13, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92ac913fc732f09813a7258996d5262164586370e9b01766dbc9ba37aa2e7fcc
|
|
| MD5 |
8d32aac149c9874232cb17172e82b38c
|
|
| BLAKE2b-256 |
b0baee7513d9fecf45e2c8bddd87faf61af62953f56782a78ef27c490dcbef95
|
Provenance
The following attestation bundles were made for linux_rt_upscaler-0.2.9.post1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:
Publisher:
build_wheels.yml on baronsmv/linux-rt-upscaler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
linux_rt_upscaler-0.2.9.post1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl -
Subject digest:
92ac913fc732f09813a7258996d5262164586370e9b01766dbc9ba37aa2e7fcc - Sigstore transparency entry: 1260360831
- Sigstore integration time:
-
Permalink:
baronsmv/linux-rt-upscaler@44104357a060b13c6419e915448353cc11579c9e -
Branch / Tag:
refs/tags/v0.2.9 - Owner: https://github.com/baronsmv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@44104357a060b13c6419e915448353cc11579c9e -
Trigger Event:
push
-
Statement type:
File details
Details for the file linux_rt_upscaler-0.2.9.post1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.
File metadata
- Download URL: linux_rt_upscaler-0.2.9.post1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- Upload date:
- Size: 760.8 kB
- Tags: CPython 3.12, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
616633466548879a30443150baac3ba0ac1d85f98eef5adbd3cb0f71147bbaec
|
|
| MD5 |
9c8cdae25a190fcf76b21954a4ac9376
|
|
| BLAKE2b-256 |
3e39fa46e9a77faa4f89e00e582507f0a9f2e0a0a705a1935070ac3b1c1a97ad
|
Provenance
The following attestation bundles were made for linux_rt_upscaler-0.2.9.post1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:
Publisher:
build_wheels.yml on baronsmv/linux-rt-upscaler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
linux_rt_upscaler-0.2.9.post1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl -
Subject digest:
616633466548879a30443150baac3ba0ac1d85f98eef5adbd3cb0f71147bbaec - Sigstore transparency entry: 1260360931
- Sigstore integration time:
-
Permalink:
baronsmv/linux-rt-upscaler@44104357a060b13c6419e915448353cc11579c9e -
Branch / Tag:
refs/tags/v0.2.9 - Owner: https://github.com/baronsmv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@44104357a060b13c6419e915448353cc11579c9e -
Trigger Event:
push
-
Statement type:
File details
Details for the file linux_rt_upscaler-0.2.9.post1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.
File metadata
- Download URL: linux_rt_upscaler-0.2.9.post1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- Upload date:
- Size: 760.7 kB
- Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38f48417fa7ae39f2544dca9e1e27077eb696f49834ffd2d562a47b68c2489ff
|
|
| MD5 |
5c6d3ccbe3068e71b3b791ca6ce4ebb7
|
|
| BLAKE2b-256 |
59fd01f566c82363a11680c29541de74d960367f2844f7a00f31eb3ff782c139
|
Provenance
The following attestation bundles were made for linux_rt_upscaler-0.2.9.post1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:
Publisher:
build_wheels.yml on baronsmv/linux-rt-upscaler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
linux_rt_upscaler-0.2.9.post1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl -
Subject digest:
38f48417fa7ae39f2544dca9e1e27077eb696f49834ffd2d562a47b68c2489ff - Sigstore transparency entry: 1260360547
- Sigstore integration time:
-
Permalink:
baronsmv/linux-rt-upscaler@44104357a060b13c6419e915448353cc11579c9e -
Branch / Tag:
refs/tags/v0.2.9 - Owner: https://github.com/baronsmv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@44104357a060b13c6419e915448353cc11579c9e -
Trigger Event:
push
-
Statement type:
File details
Details for the file linux_rt_upscaler-0.2.9.post1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.
File metadata
- Download URL: linux_rt_upscaler-0.2.9.post1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- Upload date:
- Size: 760.7 kB
- Tags: CPython 3.10, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c054971874d91114998d529dc0dc2435c46b68d72b4a8672dd139905c0a50b72
|
|
| MD5 |
5400fbf60b739713bc1db3b4b1351137
|
|
| BLAKE2b-256 |
346402811f0c9e5c9133411638169386cf6927f3b280d4a503462b1d0fedbec6
|
Provenance
The following attestation bundles were made for linux_rt_upscaler-0.2.9.post1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:
Publisher:
build_wheels.yml on baronsmv/linux-rt-upscaler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
linux_rt_upscaler-0.2.9.post1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl -
Subject digest:
c054971874d91114998d529dc0dc2435c46b68d72b4a8672dd139905c0a50b72 - Sigstore transparency entry: 1260360405
- Sigstore integration time:
-
Permalink:
baronsmv/linux-rt-upscaler@44104357a060b13c6419e915448353cc11579c9e -
Branch / Tag:
refs/tags/v0.2.9 - Owner: https://github.com/baronsmv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@44104357a060b13c6419e915448353cc11579c9e -
Trigger Event:
push
-
Statement type:
File details
Details for the file linux_rt_upscaler-0.2.9.post1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.
File metadata
- Download URL: linux_rt_upscaler-0.2.9.post1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- Upload date:
- Size: 760.7 kB
- Tags: CPython 3.9, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
299b00792e355ce1e8fb3a65ad7e92a99cc2c36b010cdd43abcf02289017ac84
|
|
| MD5 |
11257156adf43877a5e315f152018efd
|
|
| BLAKE2b-256 |
77615bb579baff9cada23690a5718823b0c8d796896860a2c07f69e01286c4ab
|
Provenance
The following attestation bundles were made for linux_rt_upscaler-0.2.9.post1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:
Publisher:
build_wheels.yml on baronsmv/linux-rt-upscaler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
linux_rt_upscaler-0.2.9.post1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl -
Subject digest:
299b00792e355ce1e8fb3a65ad7e92a99cc2c36b010cdd43abcf02289017ac84 - Sigstore transparency entry: 1260360645
- Sigstore integration time:
-
Permalink:
baronsmv/linux-rt-upscaler@44104357a060b13c6419e915448353cc11579c9e -
Branch / Tag:
refs/tags/v0.2.9 - Owner: https://github.com/baronsmv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@44104357a060b13c6419e915448353cc11579c9e -
Trigger Event:
push
-
Statement type: