Skip to main content

Real-time AI upscaler for any Linux window

Project description

Real‑Time Upscaler for Linux

PyPI version Python versions License: GPLv3

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.
    • 4x32
    • 4x24
    • 4x16
    • 4x12
    • 3x12
    • fast – Default. Recommended for slow machines.
    • faster
    • veryfast – 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.
  • 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)
  • Python 3.10 or newer

[!NOTE] Python 3.14 compatibility

Previously, we advised against Python 3.14 due to a suspected Vulkan backend issue (#1). Recent testing shows it should now work without problems.

Python 3.14 is supported; however, our testing has been limited. If you encounter any issues, please report them.

For a safe fallback, you can still use Python 3.13:

pipx install --python=python3.13 --fetch-missing-python linux-rt-upscaler

Installation

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

First, install the required build tools and development headers for your distribution.

Debian / Ubuntu / Linux Mint

sudo apt update
sudo apt install gcc make libvulkan-dev libx11-dev libxcb-dev libxext-dev libxdamage-dev libxfixes-dev

Fedora / RHEL / CentOS

sudo dnf install gcc make vulkan-loader-devel libX11-devel libxcb-devel libXext-devel libXdamage-devel libXfixes-devel

Arch Linux / CachyOS

sudo pacman -S base-devel vulkan-devel libx11 libxcb libxext libxdamage libxfixes

openSUSE

sudo zypper install gcc make vulkan-devel libX11-devel libxcb-devel libXext-devel libXdamage-devel libXfixes-devel

Then clone the repository and install the package in development mode:

git clone https://github.com/baronsmv/linux-rt-upscaler.git
cd linux-rt-upscaler

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+C in 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

  1. Window Selection – Uses X11 to find the target window by PID or WM_CLASS.
  2. Capture – Grabs the window's pixels using a fast custom C library.
  3. AI Upscaling – CuNNy compute shaders (written in HLSL, compiled via Compushady) produce a 2x (or 4x) larger image.
  4. 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.
  5. Display – The result is rendered in a transparent overlay window that bypasses the window manager (so it always stays on top).
  6. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

linux_rt_upscaler-0.2.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (784.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

linux_rt_upscaler-0.2.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (784.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

linux_rt_upscaler-0.2.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (784.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

linux_rt_upscaler-0.2.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (784.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

linux_rt_upscaler-0.2.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (784.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

File details

Details for the file linux_rt_upscaler-0.2.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for linux_rt_upscaler-0.2.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6ce1d9aa9eb95997a9de99e9a65ee938d6079fbc9f78c32cdcce55c71a5f81cb
MD5 2fbdb2061ddae9c85f395f2ce3056b4d
BLAKE2b-256 fdc7829e9daf317e4c1eaa5d20ac177145979bd2c4fdf37910fa60feb01adb9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for linux_rt_upscaler-0.2.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on baronsmv/linux-rt-upscaler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file linux_rt_upscaler-0.2.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for linux_rt_upscaler-0.2.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 64a6afa23cc16f6960c581c3a43f3d2222414d27f2a6a32f130ae4c79e41dde1
MD5 0ebcadc7803678748726fa5d52fbd21b
BLAKE2b-256 f8af7716ef605e8f4201b110a52f09d46c75f24c40f549c9cc9e1fa998f64586

See more details on using hashes here.

Provenance

The following attestation bundles were made for linux_rt_upscaler-0.2.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on baronsmv/linux-rt-upscaler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file linux_rt_upscaler-0.2.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for linux_rt_upscaler-0.2.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 506b9d47eca26d8deee0fd77c13a221884a7fda2645c944c9468a47362cbc06f
MD5 eefd6f70dbdda8ab9ceaa9e53294d503
BLAKE2b-256 f6de31d059141424c05bb3d0b1edc81a7acdb183a916841744b1add814b0ebe8

See more details on using hashes here.

Provenance

The following attestation bundles were made for linux_rt_upscaler-0.2.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on baronsmv/linux-rt-upscaler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file linux_rt_upscaler-0.2.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for linux_rt_upscaler-0.2.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d762f6d5f43b9582d9d7badb48bad1440fe86600939bdd02de8db28050041e8e
MD5 29426c3701f5ff00bcaf9c5ea6c188a7
BLAKE2b-256 344d140377e59718294c141f769811808e58552ed5a969daf2af565e67d51a50

See more details on using hashes here.

Provenance

The following attestation bundles were made for linux_rt_upscaler-0.2.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on baronsmv/linux-rt-upscaler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file linux_rt_upscaler-0.2.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for linux_rt_upscaler-0.2.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ccab7d557a715410b77fa3d206ba997866356d164667890b3eb8b25c690fcdc0
MD5 c4d4ef94a4ae433873f801e5d4a87ae8
BLAKE2b-256 13fb536c706fc4a7da80be26d5895ca7fff638f5344fbdd5760e7dfe1e2653c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for linux_rt_upscaler-0.2.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on baronsmv/linux-rt-upscaler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page