A Windows WPF application for multiboxing the Unora game client. It watches for game client windows and docks them as borderless overlays inside a tabbed manager window - the clients stay real top-level windows (never reparented), so input and rendering keep working exactly as they would standalone.
overview.mp4
- Groups - always-visible top-level tabs, each holding any number of characters
- Per-group layouts - Tabs, Columns, Rows, Grid, or Grid Tight (windows packed edge-to-edge as one centered block, no splitters)
- Drag-to-reorder group tabs, plus a Reorder mode that hides the overlays and lets you drag-swap character positions
- Sticky placement - character placement is remembered by name (case-insensitive), so everyone lands back in the same spot next session
- Scaling modes
- Pixel Perfect - snaps windows to integer multiples of the client's native 640x480 for crisp text (default)
- Stretch - fills the whole cell, ignoring aspect ratio (only stretches if the game's display setting is "borderless stretched")
- Both off - smooth 4:3 aspect fit
- Hold Shift while resizing a cell to freely scale that window, overriding the snap
- Six color themes - Light, Solarized, Sakura, Dark, Midnight, Forest
- Hover Focus - focus follows the mouse: hovering a docked client gives it keyboard focus without clicking. It only activates while focus is already inside the app, so it never steals focus from other programs. Toggleable from the toolbar
- Jump-to-character dropdown - lists every loaded character and jumps straight to whoever's picked
- Automatic client pickup - matched windows are detected and docked as they appear
- Zero-friction settings - one auto-saved file at
%AppData%\UnoraWindowManager\settings.json, rewritten on every change - Clean exit - windows are never reparented; on exit their original style, position, and taskbar entries are restored
- Windows (win-x64)
- .NET 10 Desktop Runtime to run the released exe (the release build is framework-dependent single-file)
.NET 10 SDK must be installed.
dotnet build
Or with go-task:
task build # build the solution (Debug)
task test # run the test suite
task publish # publish a single-file exe to dist/
Releases are automated: pushing a v* tag triggers the GitHub Action in .github/workflows/release.yml, which runs the tests, publishes the exe, and attaches it to a GitHub release.
Each character slot in the manager is a plain WPF placeholder. The real client window is never SetParent'd - it stays a genuine, independent top-level window. The manager only strips its non-client chrome (title bar, resize border, system menu) and continuously repositions it via SetWindowPos to sit exactly over its placeholder, restacked directly above the manager in z-order. All cross-process window operations are async, so a slow client can't freeze the manager UI. An earlier true-reparenting implementation was abandoned because it broke the game client's rendering and keyboard input; since the overlay approach never structurally alters the windows, restoring them on exit is trivial - original style, position, and taskbar entries come back cleanly.