Your monitor layouts, one click away.
Save and restore Windows display configurations from a desktop app, a tray menu, or a global hotkey. Made for KVM switches, docking stations, and multi-monitor desks.
Download for Windows · Getting started · Report a bug · Contribute
Free and open source. MIT licensed. No account required.
Switching a KVM or reconnecting a dock can leave Windows with the wrong primary display, positions, or refresh rates. MonitorSnap lets you save a known layout and reapply it when you need it.
- KVM desks: restore your preferred display configuration after switching computers.
- Work and gaming: keep separate presets for the layouts you use throughout the day.
- Docks and TVs: save configurations for your desk monitors and other connected screens.
MonitorSnap configures displays. It does not save or restore individual application window positions, switch a physical KVM, or connect disconnected monitors.
Get the files from GitHub Releases. Windows 10 or 11, x64. The downloads include the backend; you do not need Python or Node.js installed.
| Package | Choose this if... |
|---|---|
Installer - MonitorSnap-Setup-<version>.exe |
You want a regular installation with a Start Menu entry and an uninstaller. Recommended for most users. |
MSI - MonitorSnap-<version>.msi |
You need a Windows Installer package for managed deployment. |
Portable - MonitorSnap-Portable-<version>.exe |
You want a single executable with its data in a MonitorSnapData folder beside it. Keep it in a writable folder. |
ZIP - MonitorSnap-<version>-win.zip |
You prefer to extract the application folder and run MonitorSnap.exe without an installer. Settings use AppData. |
The release binaries are not code signed. Windows SmartScreen may show an unknown-publisher warning. Check that your download came from this repository's Releases page before deciding whether to run it.
Release packages are built by the public GitHub Actions release workflow.
Download SHA256SUMS.txt from the same release as your package, then calculate its SHA-256 in PowerShell:
Get-FileHash -LiteralPath .\MonitorSnap-Setup-2.6.2.exe -Algorithm SHA256Use your downloaded file's name and compare the full hash with its entry in SHA256SUMS.txt.
A matching hash verifies that your file matches the published package; it is not a malware-free certification.
A SmartScreen reputation or unknown-publisher warning is different from an antivirus detection with a threat name. For example, Edge's "isn't commonly downloaded" message means the download has not established sufficient reputation; the message alone is not a named malware detection. Code signing is not yet available for these releases. Do not disable antivirus protection or add exclusions to install MonitorSnap. If an antivirus flags a download, please report it with the version, package name, SHA-256, antivirus product, and exact detection name. Remove personal information from screenshots or logs.
The v2.6.2 verification record tracks Installer EXE, MSI, Portable EXE, and ZIP separately, with package hashes, dated local Microsoft Defender results, and Microsoft/VirusTotal review status. It distinguishes completed scans from pending or blocked submissions.
Arrange your monitors in Windows Settings > System > Display. Choose the primary display, extend or duplicate screens, and set the resolutions and refresh rates you want.
Open MonitorSnap, go to Presets, and click + or Save current config. Give the layout a recognizable name, such as Work desk, and confirm. Select the saved preset to see its layout and monitor details.
Change your display configuration in Windows, then save it as another preset. Each preset captures the configuration at the time you save it.
Select a preset and click Apply. You can also right-click the MonitorSnap tray icon and choose a preset under Quick Apply.
Connect the displays used by the preset and let Windows finish detecting them first. Screens may briefly go blank while Windows changes the configuration.
Select a preset, click its Hotkey field, and press a combination such as Ctrl+Alt+Shift+F9. The shortcut works while MonitorSnap is running, including when its window is hidden in the tray. If a shortcut is unavailable or already in use, choose another combination.
In Settings, enable Start with Windows and Start minimized if you want MonitorSnap available in the tray after signing in. Minimize after apply hides the window after switching layouts. Closing the window keeps the app in the tray; use Exit in the tray menu to quit.
The Displays page shows the current layout, primary screen, resolutions, refresh rates, scale, and positions. Mirrored displays appear together in the canvas.
The screenshots show four connected displays: a QHD primary monitor, a side monitor, and two mirrored displays. The preset list includes example layouts for work, an extended workspace, and presentations.
Choose a light, dark, or system theme; control startup and minimize behavior; adjust text size; and export or import presets from Settings.
Layout editing is experimental. To try the drag editor, enable Settings > Beta Features > Edit preset layouts. It adds editing controls to presets and the Displays page. For everyday use, configure displays in Windows and capture the result as a preset.
- Back up presets: use Settings > Data > Export. Use Import to bring an exported file back into the app. Monitor identities are specific to your hardware; importing a preset does not make it suitable for a different desk.
- Installed and ZIP builds: data is stored in
%APPDATA%\MonitorSnap\, includingpresets,settings.json, anddebug.log. - Portable builds: data is stored in
MonitorSnapDatabeside the portable executable. Move that folder with the executable to keep your presets. - Local display control: the Python backend listens on a random loopback port,
127.0.0.1, and the Electron app talks to it locally. - Update checks: the app contacts the GitHub Releases API after startup and when you check manually in About. Display presets stay on your machine; they are not sent with the update check. Updates are downloaded and installed manually.
| Problem | What to try |
|---|---|
| A preset cannot find a display | Connect the original monitors, wait for detection, and try again. If cabling or hardware changed, capture a new preset. |
| The layout is wrong after docking or a KVM switch | Wait until Windows has detected all displays before applying the preset. |
| A hotkey does nothing | Keep MonitorSnap running and check the preset's shortcut status. Another application may own the combination. |
| A resolution or refresh rate cannot be restored | Confirm that Windows offers that mode for the current connection. GPU, cable, dock, and driver limits still apply. |
| Something else fails | Check debug.log in the data folder and open an issue. Include your app version, Windows version, GPU, monitor connections, and reproduction steps. Review logs for private details before sharing them. |
MonitorSnap is Windows-only. Custom GPU modes and unusual display configurations may need additional testing. Display scale is shown in the UI; do not rely on presets to change Windows DPI scaling.
You need Windows, Python 3.10+, Node.js 24+, and Git for development.
git clone https://github.com/GTRows/MonitorSnap.git
cd MonitorSnap
.\dev.batOr start the development app manually:
cd electron-app
npm ci
npm run electron:devElectron starts the Python backend automatically. To run only the backend, use python -m display_presets.server from the repository root.
From the repository root:
python -m pip install pytest
python -m pytest tests/ -q
cd electron-app
npm test
npm run buildThe release workflow builds the standalone Python backend with PyInstaller, bundles it into Electron, and produces Installer, MSI, Portable, and ZIP downloads. Use the workflow as the reference for packaging; npm run electron:build requires the backend executable to exist first. MSI packaging also requires WiX and electron-wix-msi.
The source package includes a command-line interface for scripts. From the repository root:
python -m display_presets current
python -m display_presets save "Work desk"
python -m display_presets list
python -m display_presets apply "Work desk"
python -m display_presets --helpThe CLI uses name-based preset files; the desktop app uses UUID-based preset files. They are separate workflows. For desktop presets, use the app's own save, apply, export, and import controls.
Electron + React + TypeScript provide the interface. A Python standard-library backend uses ctypes to call the Windows Display Configuration API (QueryDisplayConfig / SetDisplayConfig). Applying a preset restores topology first, then modes and positions.
Bug reports, hardware compatibility feedback, documentation improvements, and pull requests are welcome. Start with CONTRIBUTING.md for setup and contribution guidelines, and ROADMAP.md for future ideas.
Please report security vulnerabilities privately. Community participation follows the Code of Conduct.
MIT. Free to use, modify, and share.
