Skip to content

About

πŸ”„ Your wall display, on autopilot – rotate any running Windows app (dashboards, camera feeds, spreadsheets) on a shop-floor or office screen. Native .NET 10 tray app, zero dependencies.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Window Rotator logo

Window Rotator

Your wall display, on autopilot. πŸ”„

Rotate any running Windows apps – dashboards, camera feeds, spreadsheets – on a shop-floor or office display. Drag, drop, set the seconds, hit Start, close the window. It just keeps going.

CI Release License: MIT .NET 10 Windows 10 | 11 Dependencies: 0

⬇ Download Β· Quick start Β· How it works Β· Docs (DE) Β· Roadmap

Window Rotator: window library on the left, rotation plan with per-window durations on the right

πŸ€” Why?

Every factory hall, control room and open office has that screen: one PC, one big monitor, and three things people need to see – the production dashboard, the camera feed, the shift plan. Someone switches between them by hand. Or nobody does.

Browser tab rotators only rotate browser tabs. Kiosk software wants you to rebuild everything as a web page. Window Rotator rotates the real windows you already have open – any app, as-is.

✨ Features

πŸ–±οΈ Drag & drop setup All open windows with icon and title on the left – drag them into your rotation. No config files, no scripting.
⏱️ Per-window timing 30 s for the dashboard, 15 s for the camera. Live total cycle time. Toggle entries on/off without deleting them.
🧠 Survives restarts App crashed? PC rebooted? Windows are re-matched by process, class and title – and it never guesses: a wrong window on a wall display is worse than none.
πŸ–₯️ Multi-monitor aware Pick a target display; windows are moved there (maximized state kept), other screens stay untouched.
πŸ«₯ Lives in the tray Close the window, rotation keeps running. Pause, resume, next, stop – all from the tray menu.
πŸ›‘οΈ Built for 24/7 Monotonic clock, hung-app detection, verified activation with retry-then-skip, auto-pause on session lock, crash-safe atomic saves, daily logs.
πŸš€ Autostart Starts at logon straight into the tray and resumes your last profile.
πŸͺΆ Zero dependencies Native WPF on .NET 10, single self-contained EXE. No Electron, no browser, no runtime install.
Settings: target monitor, failure strategy, autostart Event log
Per-profile options & program settings Event log for unattended operation

The UI is in German for now – English localisation is on the roadmap. PRs welcome! πŸ‡¬πŸ‡§

πŸš€ Quick start

  1. Grab WindowRotator-<version>-win-x64.zip from the latest release and unzip it (downloaded? Unblock-File first – the EXE isn't signed yet).
  2. Install for the current user – no admin rights needed:
    powershell -ExecutionPolicy Bypass -File Install.ps1 -Autostart
    …or just run WindowRotator.exe from anywhere.
  3. Open the apps you want to show, drag them into the rotation, set the seconds, press Start. Done. β˜•

πŸ“– Full guides (German): Kurzanleitung Β· Administratorhandbuch

πŸ”§ How it works

flowchart TB
    UI["WPF UI<br/><sub>drag & drop Β· rotation editor</sub>"] --> VM["MainViewModel<br/><sub>profiles Β· re-matching</sub>"]
    VM --> E["RotationEngine<br/><sub>pure state machine Β· timing Β· retry/skip</sub>"]
    E -- "activate / verify (injected)" --> W["Win32 layer<br/><sub>discovery Β· matching Β· activation</sub>"]
    VM --> S["Store<br/><sub>versioned JSON Β· autosave</sub>"]
    T["Tray host<br/><sub>single instance Β· session lock</sub>"] --> VM
Loading
  • State machine: Stopped β†’ Running ⇄ Paused, plus Waiting when no window is available (re-checked every 5 s).
  • Activation: restore if minimized β†’ move to target monitor β†’ SetForegroundWindow β†’ optional double-ALT fallback for Windows' focus lock β†’ verified 1 s later. Everything that touches a foreign window is asynchronous, so a frozen app can never freeze the rotator.
  • Re-matching: same process (+ optional title filter) β†’ exact title β†’ exactly one candidate with the same window class β†’ otherwise the entry is marked ambiguous and skipped.

πŸ› οΈ Build from source

dotnet build Fensterwechler.slnx                   # 0 warnings, or it didn't happen
dotnet run --project Fensterwechler.Tests          # dependency-free self-check
powershell -File build\publish.ps1                 # β†’ dist\WindowRotator-<version>-win-x64.zip
Path What's inside
Fensterwechler/ The app (WPF, MVVM, Win32 interop)
Fensterwechler.Tests/ Self-check for engine, matcher and persistence
build/ publish.ps1, Install.ps1, icon generator
samples/ Example profile (Edge dashboard + camera client)
docs/ User & admin guides (German), screenshots

Fensterwechsler is German for "window switcher" – the working title lives on in the header and (minus one letter) in the Fensterwechler namespace. πŸ‡©πŸ‡ͺ

πŸ—ΊοΈ Roadmap

  • πŸ‡¬πŸ‡§ English UI (resource-based localisation)
  • πŸ–ΌοΈ Live thumbnails in the window library (DWM thumbnails)
  • πŸ—“οΈ Time-based profiles (e.g. night shift layout)
  • πŸ” Code-signed releases
  • πŸ“¦ winget package

Got an idea? Open a feature request ✨

🀝 Contributing

Contributions are super welcome – see CONTRIBUTING.md. Please follow the Code of Conduct; security issues go through SECURITY.md.

πŸ“„ License

MIT – use it, ship it, put it on every screen in the building.

Made with β˜• and a slightly unhealthy obsession with wall displays.

About

πŸ”„ Your wall display, on autopilot – rotate any running Windows app (dashboards, camera feeds, spreadsheets) on a shop-floor or office screen. Native .NET 10 tray app, zero dependencies.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages