GTK4 app for controlling the Titan Army P275MV PLUS monitor on Linux over DDC/CI
Rust
0
10 commits
updated Oct 2, 2026
A Linux app for the Titan Army P275MV PLUS monitor. It changes the monitor's own settings over DDC/CI, the same settings as the on-screen menu (OSD): picture modes, local dimming, HDR, game overlays, PIP, LED lighting and more. Nothing is emulated in software.
Built with Rust, GTK 4 and libadwaita. It is not affiliated with Titan Army.
⚠️ Use at your own risk
This software writes settings to your monitor over DDC/CI. A wrong write can change or lock features or, in the worst case, leave the monitor in a state that needs a factory reset or service. The authors give no warranty (see the MIT license) and are not responsible for any damage.
🤖 Developed with an LLM
This repository was developed with the help of a large language model (LLM, Claude). The code, documentation and the protocol notes in
docs/were written and revised with LLM assistance and checked against a real monitor by the author, but they may still contain mistakes. Review the code before you trust it with your hardware.

The protocol, every VCP code and the tools used to find them are documented in docs/p275mv_plus.md.
i2c-dev).blueprint-compiler, Rust ≥ 1.88.kscreen-doctor (KDE Plasma) or cosmic-randr (COSMIC) for the display mode, HDR and wallpaper features;Tested with a P275MV PLUS (Enhanced) connected over DisplayPort to an AMD GPU, on KDE Plasma 6 (Wayland).
Every version is published on the Releases page:
| File | For |
|---|---|
titan-control_<version>_amd64.deb | Debian 13+, Ubuntu 25.04+: sudo apt install ./titan-control_*.deb |
titan-control-<version>.x86_64.rpm | Fedora 42+: sudo dnf install ./titan-control-*.rpm |
Titan_Control-<version>-x86_64.AppImage | recent distributions (glibc 2.41+), GTK is bundled: chmod +x, then run |
titan-control-<version>-x86_64-linux.tar.gz | any distribution, see below |
The deb and rpm install the I2C rules (uaccess udev rule and the i2c-dev module), so no group changes are needed.
The AppImage and the archive installed as a user need I2C access set up by hand. Everything except
the AppImage needs GTK ≥ 4.14 and libadwaita ≥ 1.7 on your system (see Requirements).
tar -xzf titan-control-*-x86_64-linux.tar.gz
cd titan-control-*-x86_64-linux
./install.sh # to ~/.local (as root: /usr/local, with the I2C rules); --prefix DIR for another
Then set up I2C access unless you ran the script as root, and start Titan Control from the menu.
./uninstall.sh removes it again (your settings stay in ~/.config/titan_control). To build the archive yourself:
./scripts/make_tarball.sh (it ends up in dist/).
# Arch Linux
sudo pacman -S gtk4 libadwaita blueprint-compiler rust
# Fedora
sudo dnf install gtk4-devel libadwaita-devel blueprint-compiler cargo
# Debian / Ubuntu (libadwaita 1.7: Debian 13, Ubuntu 25.04 or newer)
sudo apt install libgtk-4-dev libadwaita-1-dev blueprint-compiler cargo
sudo modprobe i2c-dev
echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf # load it on every boot
sudo groupadd -f i2c
sudo usermod -aG i2c "$USER"
Log out and back in. If /dev/i2c-* is not owned by the i2c group on your distribution, add a udev rule:
echo 'KERNEL=="i2c-[0-9]*", GROUP="i2c", MODE="0660"' | sudo tee /etc/udev/rules.d/45-i2c.rules
sudo udevadm control --reload && sudo udevadm trigger
git clone https://github.com/mkarenko/titan-control.git
cd titan-control
./scripts/install_local.sh
The script builds a release binary, installs it to ~/.local/bin/titan_control, copies the assets to
~/.local/share/titan_control/, and adds the icon and a menu entry. To only build it: cargo build --release.
Start Titan Control from the application menu (or run titan_control).
The app keeps a log of what it does, so a problem can be debugged. Open it with menu ⋮ → Show the log file or find it
at ~/.local/state/titan_control/titan_control.log ($XDG_STATE_HOME is respected). The log holds the app, system,
GTK and libadwaita versions, the monitor connection, every setting the app writes with the result of its read-back,
and errors. It is cut at 1 MiB (the older part is kept as titan_control.log.1).
When you open an issue, please attach the log, say which
monitor and firmware package you have, and what you did before the problem. The log contains the monitor name, but no
serial number or personal data; read it before you share it. For a problem seen while the app is running, starting it
from a terminal (titan_control) prints the same lines.
cargo run # the app (a running instance is activated instead of starting a second one)
cargo test # unit tests
TITAN_I2C=/dev/i2c-14 cargo test profile_table -- --ignored --nocapture # hardware test: profile table reads
cargo clippy --all-targets
UI check without a monitor (does not touch the bus or a running instance):
TITAN_CHECK_UI=1 cargo run # builds the window and exits
TITAN_CHECK_UI=1 TITAN_CHECK_UI_SHOTS=/tmp/shots cargo run # saves a PNG of every page and of Preferences
TITAN_CHECK_UI_WIDTH=600 TITAN_CHECK_UI_HEIGHT=2000 … # window size (narrow layout, tall pages)
TITAN_CHECK_LANG=en … # language of the check (en or pl)
TITAN_CHECK_STARS=1 … # show the favorite stars
Titan Control is free. If it is useful to you, you can buy me a coffee ☕.
Set the new version in Cargo.toml, commit, then push a tag with the same number:
git tag v1.2.3 && git push origin v1.2.3
The Release workflow builds the tar.gz, deb, rpm and AppImage and publishes them,
with checksums, as a GitHub release (a tag with a suffix, such as v1.2.3-beta.1, becomes a pre-release). The tag
must match the version in Cargo.toml, or the workflow stops. The workflow can also be started by hand from the
Actions tab: it then only builds the files and keeps them as downloadable artifacts.
MIT.
Rust
83.5%
Blueprint
13.6%
Shell
2.1%
GTK4 app for controlling the Titan Army P275MV PLUS monitor on Linux over DDC/CI
Rust
0
10 commits
updated Oct 2, 2026
A Linux app for the Titan Army P275MV PLUS monitor. It changes the monitor's own settings over DDC/CI, the same settings as the on-screen menu (OSD): picture modes, local dimming, HDR, game overlays, PIP, LED lighting and more. Nothing is emulated in software.
Built with Rust, GTK 4 and libadwaita. It is not affiliated with Titan Army.
⚠️ Use at your own risk
This software writes settings to your monitor over DDC/CI. A wrong write can change or lock features or, in the worst case, leave the monitor in a state that needs a factory reset or service. The authors give no warranty (see the MIT license) and are not responsible for any damage.
🤖 Developed with an LLM
This repository was developed with the help of a large language model (LLM, Claude). The code, documentation and the protocol notes in
docs/were written and revised with LLM assistance and checked against a real monitor by the author, but they may still contain mistakes. Review the code before you trust it with your hardware.

The protocol, every VCP code and the tools used to find them are documented in docs/p275mv_plus.md.
i2c-dev).blueprint-compiler, Rust ≥ 1.88.kscreen-doctor (KDE Plasma) or cosmic-randr (COSMIC) for the display mode, HDR and wallpaper features;Tested with a P275MV PLUS (Enhanced) connected over DisplayPort to an AMD GPU, on KDE Plasma 6 (Wayland).
Every version is published on the Releases page:
| File | For |
|---|---|
titan-control_<version>_amd64.deb | Debian 13+, Ubuntu 25.04+: sudo apt install ./titan-control_*.deb |
titan-control-<version>.x86_64.rpm | Fedora 42+: sudo dnf install ./titan-control-*.rpm |
Titan_Control-<version>-x86_64.AppImage | recent distributions (glibc 2.41+), GTK is bundled: chmod +x, then run |
titan-control-<version>-x86_64-linux.tar.gz | any distribution, see below |
The deb and rpm install the I2C rules (uaccess udev rule and the i2c-dev module), so no group changes are needed.
The AppImage and the archive installed as a user need I2C access set up by hand. Everything except
the AppImage needs GTK ≥ 4.14 and libadwaita ≥ 1.7 on your system (see Requirements).
tar -xzf titan-control-*-x86_64-linux.tar.gz
cd titan-control-*-x86_64-linux
./install.sh # to ~/.local (as root: /usr/local, with the I2C rules); --prefix DIR for another
Then set up I2C access unless you ran the script as root, and start Titan Control from the menu.
./uninstall.sh removes it again (your settings stay in ~/.config/titan_control). To build the archive yourself:
./scripts/make_tarball.sh (it ends up in dist/).
# Arch Linux
sudo pacman -S gtk4 libadwaita blueprint-compiler rust
# Fedora
sudo dnf install gtk4-devel libadwaita-devel blueprint-compiler cargo
# Debian / Ubuntu (libadwaita 1.7: Debian 13, Ubuntu 25.04 or newer)
sudo apt install libgtk-4-dev libadwaita-1-dev blueprint-compiler cargo
sudo modprobe i2c-dev
echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf # load it on every boot
sudo groupadd -f i2c
sudo usermod -aG i2c "$USER"
Log out and back in. If /dev/i2c-* is not owned by the i2c group on your distribution, add a udev rule:
echo 'KERNEL=="i2c-[0-9]*", GROUP="i2c", MODE="0660"' | sudo tee /etc/udev/rules.d/45-i2c.rules
sudo udevadm control --reload && sudo udevadm trigger
git clone https://github.com/mkarenko/titan-control.git
cd titan-control
./scripts/install_local.sh
The script builds a release binary, installs it to ~/.local/bin/titan_control, copies the assets to
~/.local/share/titan_control/, and adds the icon and a menu entry. To only build it: cargo build --release.
Start Titan Control from the application menu (or run titan_control).
The app keeps a log of what it does, so a problem can be debugged. Open it with menu ⋮ → Show the log file or find it
at ~/.local/state/titan_control/titan_control.log ($XDG_STATE_HOME is respected). The log holds the app, system,
GTK and libadwaita versions, the monitor connection, every setting the app writes with the result of its read-back,
and errors. It is cut at 1 MiB (the older part is kept as titan_control.log.1).
When you open an issue, please attach the log, say which
monitor and firmware package you have, and what you did before the problem. The log contains the monitor name, but no
serial number or personal data; read it before you share it. For a problem seen while the app is running, starting it
from a terminal (titan_control) prints the same lines.
cargo run # the app (a running instance is activated instead of starting a second one)
cargo test # unit tests
TITAN_I2C=/dev/i2c-14 cargo test profile_table -- --ignored --nocapture # hardware test: profile table reads
cargo clippy --all-targets
UI check without a monitor (does not touch the bus or a running instance):
TITAN_CHECK_UI=1 cargo run # builds the window and exits
TITAN_CHECK_UI=1 TITAN_CHECK_UI_SHOTS=/tmp/shots cargo run # saves a PNG of every page and of Preferences
TITAN_CHECK_UI_WIDTH=600 TITAN_CHECK_UI_HEIGHT=2000 … # window size (narrow layout, tall pages)
TITAN_CHECK_LANG=en … # language of the check (en or pl)
TITAN_CHECK_STARS=1 … # show the favorite stars
Titan Control is free. If it is useful to you, you can buy me a coffee ☕.
Set the new version in Cargo.toml, commit, then push a tag with the same number:
git tag v1.2.3 && git push origin v1.2.3
The Release workflow builds the tar.gz, deb, rpm and AppImage and publishes them,
with checksums, as a GitHub release (a tag with a suffix, such as v1.2.3-beta.1, becomes a pre-release). The tag
must match the version in Cargo.toml, or the workflow stops. The workflow can also be started by hand from the
Actions tab: it then only builds the files and keeps them as downloadable artifacts.
MIT.
Rust
83.5%
Blueprint
13.6%
Shell
2.1%