protondl is a modern, headless Python library for downloading and managing compatibility tools (like GE-Proton, Proton-Tkg, DXVK, and vkd3d-proton) for Steam, Lutris, and other Linux game launchers.
Inspired by the logic of ProtonUp-Qt, protondl decouples the core management logic from the GUI, providing a modular and developer-friendly API for automation, CLI tools, or custom integrations.
The goal of this project is to port all functionality from ProtonUp-Qt into a headless library that is indepenent from the Qt GUI to allow for future use in different projects. This is more of a side project that I will work on here and there. Please use ProtonUp-Qt instead for managing your compatibility tools!
- Launcher Discovery: Automatically detects Native, Flatpak, and Snap installations of Steam and other launchers.
- Modular Architecture: Easily extendable for new compatibility tools or launchers.
- Async-First: Built with httpx and asyncio for non-blocking downloads.
- Headless by Design: No Qt/GUI dependencies in the core library.
- Modern Tooling: Powered by uv, ruff, and mypy for a rock-solid developer experience.
| Tool Type | Steam | Lutris | Heroic Games Launcher | Bottles |
|---|---|---|---|---|
| ⚛️ Proton | ✅ | ✅ | ✅ | ✅ |
| 🍷 Wine | ❌ | ✅ | ✅ | ✅ |
| 🇽 VKD3D | ❌ | ✅ | ✅ | ❌ |
| 9️⃣ DXVK | ❌ | ✅ | ✅ | ❌ |
- GE-Proton (Proton)
- Wine-Tkg (Wine)
- Proton-Tkg (Proton)
- DXVK (DXVK)
- DXVK Async (DXVK)
- DXVK (nightly) (DXVK)
- vkd3d-proton (VKD3D)
uv tool install "protondl[cli] @ git+https://github.com/DavidoTek/protondl@main"
uvx run protondl-
List your launchers to find your target ID:
protondl list-launchers
-
List compatibilty tools available for the launcher:
protondl list-tools 1
-
Find available versions for a tool:
protondl list-versions GE-Proton
-
Install it:
protondl install 1 GE-Proton GE-Proton10-10
-
List installed games, the compatibility tools used by them and the areweanticheatyet.com status:
protondl list-games 1 --awacy
import asyncio
from protondl.launchers import detect_all_launchers
from protondl.installers.ge_proton import GEProtonInstaller
async def main():
# Detect Steam -> add more checks here since there can be multiple launchers
launchers = detect_all_launchers()
steam = launchers[0]
# Initialize Installer
ge = GEProtonInstaller()
# Install latest GE-Proton
await ge.install(version="latest", launcher=steam)
asyncio.run(main())protondl uses the uv package manager for high-performance dependency management.
-
Clone and Install
git clone https://github.com/DavidoTek/protondl.git cd protondl uv sync uv run protondl --help -
Code Quality & Standards
We use Ruff for linting/formatting and Mypy for strict type checking.
- Format code:
uv run ruff format . - Lint code:
uv run ruff check --fix . - Type check:
uv run mypy src tests - Unit tests:
uv run pytest tests
- Format code:
-
Pre-commit Hooks
Ensure your code is compliant before every commit:
uv run pre-commit install
src/protondl/
├── cli/ # Rich-powered terminal interface
├── core/ # Abstract Base Classes and Enums (The Contract)
├── installers/ # Tool-specific logic (GE-Proton, Luxtorpeda)
├── launchers/ # Launcher discovery (Steam, Lutris, etc.)
├── services/ # Online service (AWACY, ProtonDB)
└── util/ # Utility functions (downloads, etc.)
The project was originally inspired by AUNaseef's protonup for which I created an initial GUI. Since the library didn't have the necessary features and upstreaming was slow, I started with the development of ProtonUp-Qt. Thanks to the many ProtonUp-Qt contributers, the project was able to grow and become as feature rich as it is today. While ProtonUp-Qt is well working, the original idea of having a headless library and a separate GUI was lost. This is where protondl comes in. The idea is to port the features of ProtonUp-Qt into a headless library, featuring modern CLI and API interfaces.