funman300 22fa1efabf Add setup tray entry, wizard progress/log, config add/remove, stale-wine check
- tray: uninstalled launchers now show a "Setup…" entry that spawns
  the setup wizard as a child process.
- setup.rs: download shows a progress bar (bytes / total), and
  umu-run stdout+stderr stream into a scrollable log pane. A 250 ms
  tick subscription pulls updates from the shared state.
- config add-launcher / remove-launcher CLI, with sensible defaults
  for prefix_dir, gameid, and process_pattern derived from name/exe.
- diagnose: flag stale wineserver processes when no launcher is
  running, suggesting `umutray kill`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-17 12:46:47 -07:00
2026-04-16 17:33:12 -07:00

umutray

A small system-tray daemon and CLI for running Windows game launchers on Linux via umu-launcher and GE-Proton.

Ships with presets for six launchers out of the box:

  • Battle.net
  • EA App
  • Epic Games
  • Ubisoft Connect
  • GOG Galaxy
  • Rockstar Games

Each lives in its own Wine prefix and shows up in the tray with per-launcher Launch / Kill entries. Users can add or remove launchers in config edit.

Features

  • Tray icon on any SNI-capable desktop (KDE, GNOME+AppIndicator, Xfce …).
  • Per-launcher running state reflected in the tray via a 2 s poller.
  • update-proton — streams GE-Proton releases straight to disk from GitHub (no ~600 MB in-memory buffering), with a progress indicator.
  • diagnose — sanity-checks umu-run, Vulkan, display server, per-launcher prefix / exe / ownership / running state.
  • service — installs a systemd --user unit so the tray autostarts with the graphical session.
  • setup — graphical wizard (iced) that downloads an installer URL (with progress bar) or accepts a local .exe, then runs it via umu-run in the launcher's Wine prefix with a live log pane. Uninstalled launchers expose a Setup… entry directly in the tray.

Install

cargo build --release
install -Dm755 target/release/umutray ~/.local/bin/umutray

Requires umu-launcher, tar, and vulkan-tools on PATH. On Arch:

sudo pacman -S umu-launcher vulkan-tools

Then enable autostart:

umutray service install

Usage

Command What it does
umutray Start the tray daemon (default)
umutray launchers List configured launchers and their state
umutray launch <name> Launch a specific launcher (e.g. umutray launch epic)
umutray kill [<name>] Kill one launcher, or all if no name is given
umutray diagnose [<name>] Health checks (one launcher or all)
umutray setup <name> Open the graphical setup wizard for a launcher
umutray update-proton --latest Install newest GE-Proton release
umutray update-proton --list Show recent releases without installing
umutray update-proton Interactive version picker
umutray config show / path Print current config or its file path
umutray config edit Open config in $EDITOR
umutray config set … Update globals (--proton-version, --compat-dir)
umutray config add-launcher … Append a new launcher (needs --exe-path)
umutray config remove-launcher Drop a launcher (prefix on disk is left untouched)
umutray service install Write + enable a systemd --user unit
umutray service uninstall Stop, disable, and remove the unit
umutray service status systemctl --user status umutray.service

Config

Lives at ~/.config/umutray/config.toml. A full config looks like:

proton_compat_dir = "/home/you/.local/share/Steam/compatibilitytools.d"
proton_version    = "GE-Proton"

[[launchers]]
name             = "battlenet"
display          = "Battle.net"
prefix_dir       = "/home/you/Games/battlenet"
exe_path         = "Program Files (x86)/Battle.net/Battle.net Launcher.exe"
gameid           = "umu-battlenet"
process_pattern  = "Battle\\.net"

# …one [[launchers]] block per launcher

proton_version = "GE-Proton" tells umu-launcher to auto-fetch the latest. Setting it to a pinned tag (done automatically by update-proton) uses that specific version. Each launcher may override the global proton_version with its own.

License

MIT. See LICENSE.

S
Description
No description provided
Readme MIT 1,001 KiB
Languages
Rust 99.1%
Shell 0.9%