A minimal, single-binary CLI for changing display resolution. No dependencies, no installer — just drop the binary in your PATH and go.
| Platform | Support |
|---|---|
| Windows 7 / 8 / 10 / 11 | ✅ via Win32 API |
| Linux (X11) | ✅ via xrandr |
| Linux (Wayland) | ✅ via zwlr-output-management protocol |
-
Grab
resctl.exefrom the latest release. -
Open a terminal in the folder containing the download and run:
.\resctl.exe installThis copies the binary to
%USERPROFILE%\bin\resctl.exeand adds that folder to your userPATH. -
Restart your terminal — you're done.
git clone https://github.com/dever-labs/resctl
cd resctl
.\build.ps1 # installs goversioninfo, embeds resources, builds resctl.exe
.\resctl.exe installX11 requires
xrandr(x11-xserver-utilson Debian/Ubuntu,xorg-xrandron Arch).
Wayland works out of the box — the binary speaks thezwlr-output-management-unstable-v1protocol directly. No extra packages needed. Requires a compositor that implements that protocol (e.g. sway, wayfire, labwc, or any wlroots-based compositor).
-
Grab
resctlfrom the latest release. -
Run:
chmod +x resctl ./resctl install
This copies the binary to
~/bin/resctland adds~/binto yourPATHin.bashrc,.zshrc, or.profile. -
Restart your terminal — you're done.
git clone https://github.com/dever-labs/resctl
cd resctl
go build -ldflags="-s -w" -o resctl .
./resctl installresctl uninstall
resctl list List all supported resolutions (current marked with *)
resctl get Show the current resolution
resctl set <WxH[@Hz]> Change resolution
resctl toggle [res1 res2 ...] Cycle between resolutions
resctl install Copy binary to ~/bin and add to PATH
resctl uninstall Remove binary from ~/bin
resctl version Print the installed version
Resolution format: WxH or WxH@Hz — e.g. 1920x1080 or 2560x1440@144.
# See everything your monitor supports
resctl list
# What's active right now?
resctl get
# Switch to 1080p (keeps the current refresh rate if available)
resctl set 1920x1080
# Switch to 1440p at 144 Hz explicitly
resctl set 2560x1440@144
# Set up a two-resolution toggle and switch immediately
resctl toggle 1920x1080 2560x1440
# After that, each call to `toggle` cycles to the next entry
resctl toggleToggle state is saved and persists across reboots:
- Windows:
%APPDATA%\resctl\state.json - Linux:
$XDG_CONFIG_HOME/resctl/state.json(defaults to~/.config/resctl/state.json)
- Windows — calls
EnumDisplaySettingsWandChangeDisplaySettingsWdirectly. No admin rights required for the primary display. - Linux (X11) — shells out to
xrandr. Targets the primary connected output. Requires an X11 session. - Linux (Wayland) — connects to the Wayland compositor socket and speaks the
zwlr-output-management-unstable-v1protocol natively. No external tools required. The session is detected automatically viaWAYLAND_DISPLAYorXDG_SESSION_TYPE.
The easiest way to get started is with the included Dev Container — open the repo in VS Code or GitHub Codespaces and everything is set up automatically.
- Go 1.20+
- Windows build:
goversioninfo(go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest) - Linux build:
xrandrfor smoke-testing
Windows:
.\build.ps1Or manually:
go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest
goversioninfo -64 -o resource.syso # embed icon & version metadata
go build -ldflags="-s -w -X main.version=dev" -o resctl.exe .Linux:
go build -ldflags="-s -w -X main.version=dev" -o resctl .Cross-compile for Windows from Linux (Dev Container):
GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -X main.version=dev" -o resctl.exe .Tests run without resource.syso present (the test linker cannot handle Windows COFF resource objects):
# Windows
Remove-Item resource.syso -ErrorAction SilentlyContinue
go test ./...# Linux / Dev Container
go test ./...Tag the commit you want to release, then create a release from the GitHub UI and attach the built binary as an asset:
$env:VERSION = "v1.0.0"
.\build.ps1MIT © Dever Labs