A Qt6 system-tray app that replaces Upbound's up CLI without the 250 MB Go binary.
Talks directly to api.upbound.io for cloud ops and to your Spaces clusters via
the Kubernetes API. Composition render is supported either natively (Docker +
gRPC, requires [render] extras and proto stubs) or by falling through to the
upstream crossplane CLI when present.
Open source, use at your own risk. up-tray is a community, open-source project licensed under Apache-2.0. It is provided "as is", without warranty of any kind; you assume all risk from its use. It is not an official Upbound product and is not covered by any Upbound support agreement.
Vibe coded with Claude. This app was largely vibe-coded in close pairing with Anthropic's Claude (via Claude Code), which dramatically accelerated the Upbound/Crossplane learning curve and turned ideas into working PyQt6 features fast. Review the code before you rely on it.
up-tray.webm
./run.sh # system Python + dnf-installed deps. If anything's
# missing it prints the dnf line and exits.
./run.sh --install # dnf install missing deps, then run
./run.sh --venv # force a local venv (for code iteration or non-Fedora)
./run.sh --help # the rest of the flagsFor installed-on-disk daily use use pip or build the RPM:
pip install up-trayor RPM:
./build-srpm.sh
rpmbuild --rebuild build/srpm/up-tray-*.src.rpm
sudo dnf install ~/rpmbuild/RPMS/noarch/up-tray-*.rpm
up-tray &The RPM is noarch and depends on python3-pyqt6, python3-requests,
python3-pyyaml, python3-kubernetes, with python3-keyring recommended.
No venv anywhere on the install path.
Alpha. Cloud, Spaces, kubeconfig, and xpkg paths are wired natively against
the Upbound REST API and the Kubernetes Python client. Composition render
currently shells to crossplane until proto stubs are compiled into the
package.