ulanzi-studio-niri
Linux daemon for the Ulanzi Stream Controller D200X, with Niri integration.
Bind buttons and encoders to desktop actions, commands, media controls, keystrokes, and pages. Display clocks, system stats, AI usage, and coding-agent session counts.
Quick start
Requires Python 3.11+. Install with uv:
uv tool install ulanzi-studio-niri
ulanzi-niri setup
sudo ~/.local/bin/ulanzi-niri admin-setup
setup creates the example config and starts a systemd user service, preserving
existing config. admin-setup installs USB permissions; adjust the executable
path if needed and replug the device afterward. Without systemd, run
ulanzi-niri run manually. See installation details
for pip installation and setup options.
Edit ~/.config/ulanzi-niri/config.toml using the
example config. Install the external tools used
by your actions (such as niri, playerctl, or wtype); icons are not bundled.
ulanzi-niri doctor # check your environment
ulanzi-niri control next-page # control the running daemon
ulanzi-niri ai-usage --json # read cached usage
ulanzi-niri agent-status --json # read cached agent counts
Documentation
- Configuration, pages, and icons
- AI usage widgets · Agent status
- Keyboard control
- D200X inputs · AU05 keepalive
- Releases · Changelog
Development
uv sync
uv run pytest
uv run ruff check .
See the development guide for local installation and hardware diagnostics.
Protocol details adapted from redphx/strmdck.
Metadata
Release files for ulanzi-studio-niri 2.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ulanzi_studio_niri-2.2.0.tar.gz | 168.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ulanzi_studio_niri-2.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 242.3 kB
Release files / ulanzi_studio_niri-2.2.0.tar.gz
| Download URL | ulanzi_studio_niri-2.2.0.tar.gz |
|---|---|
| Size | 168.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0c17095a0152d537f8809718c6a8f844a0f42d031db267721063e26323593df2
|
|
BLAKE2b-256 checksum How to use checksums |
88734b13806d84907d999989f6845ad7a47cd34aa3da1d31a882aa004cd9b55c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / ulanzi_studio_niri-2.2.0-py3-none-any.whl
| Download URL | ulanzi_studio_niri-2.2.0-py3-none-any.whl |
|---|---|
| Size | 73.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
21f1cad0adec433dd4762e9614dc5d3248295c294801cd761b7d56f2bd912a13
|
|
BLAKE2b-256 checksum How to use checksums |
63895fc426234fb606eb057c6f43dd0cd94c1292048defdc109c1694446c4b8c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency log