Your display's best mate. A Windows system tray app that manages brightness, colour temperature, and refresh rate across switchable profiles. Set up your preferred screen settings for work, coding, gaming, and movies — then switch between them instantly, or let DisplayPal do it for you automatically.
Built for anyone who switches between different activities on the same monitor and wants their display to adapt without fuss.
- Four display profiles — Work, Code, Game, and Cinema, each with independent settings
- Multi-monitor support — Automatically detects and controls all connected displays
- Brightness control — Hardware backlight adjustment via DDC/CI (external monitors) and WMI (laptop screens)
- Colour temperature — Direct gamma ramp control from 1200K (warm amber) to 6500K (neutral daylight)
- Refresh rate switching — Change monitor refresh rate per profile (e.g., 60Hz for work, 100Hz+ for gaming)
- System tray app — Minimal footprint, always one click away
- Manual nudges — Quickly adjust brightness or colour temperature from the tray menu or hotkeys without editing profiles
- App-aware profile switching — Automatically detects games and switches to your Game profile. Uses four detection layers: Windows game registry, Steam/Epic library scanning, fullscreen detection, and DirectX/Vulkan DLL analysis. Works with any GPU (NVIDIA, AMD, Intel). Reverts when you close the game.
- Productivity app detection — Recognises ~50 common productivity apps (Office suite, VS Code, Notepad++, browsers, Teams, Slack, terminals, design tools, and more) and can auto-switch to your preferred Work or Code profile.
- Custom app rules — Map any application to any profile (e.g., VLC → Cinema, VS Code → Code)
- Global hotkeys — Ctrl+Alt+1/2/3/4 for instant profile switching (configurable)
- Ambient mode — Colour temperature gradually shifts throughout the day following the sun's position (warm at night, neutral at noon)
- Sunrise/sunset auto-switching — Automatically shifts to a configured profile at sunset and sunrise
- Time-based scheduling — Set fixed times to switch profiles (e.g., Work at 8am, Code at 6pm)
- Monitor wake recovery — Automatically re-applies your profile when the display wakes from sleep
- Cinema mode — A dedicated profile for movie watching (30% brightness, 3500K warm, purple tray icon)
- Panic button — Ctrl+Alt+P instantly switches to Work mode (for when the boss walks in)
- Quick Dim — Ctrl+Alt+D instantly drops brightness to 10% and back
- Profile Lock — Ctrl+Alt+L prevents scheduled switches from interrupting your gaming session
- Disco mode — Ctrl+Alt+Shift+D for 5 seconds of wild colour cycling (easter egg)
- Usage stats — Track hours spent in each profile per day/week with visual bar charts
- Notification toasts — Windows notifications on profile switch (toggle-able)
- Per-profile tray icon colours — Blue (Work), Amber (Code), Green (Game), Purple (Cinema)
- Colour-coded lock indicator — Red dot on the tray icon when profile lock is active
- IP-based location detection — One-click setup for sunrise/sunset feature
- First-run system check — Verifies DDC/CI, detects conflicts (f.lux), shows available refresh rates
- Auto-start with Windows — Toggle in settings, managed via registry
- Automatic update checker — Checks GitHub for new releases on startup and notifies you if an update is available
- Multi-language support — English, German, French, Spanish, and Japanese included. Easy to add more via JSON translation files.
- Proper Windows installer — Inno Setup installer with Start Menu shortcuts, desktop icon, and auto-start option
- Windows 10 or 11
- Works on laptops (built-in screen via WMI) and external monitors (via DDC/CI)
- For external monitors, DDC/CI must be enabled in the monitor's OSD settings
- f.lux must be closed if installed — DisplayPal replaces f.lux for colour temperature control
No additional software required. DisplayPal is fully self-contained — it controls your display directly through Windows APIs. No need to install f.lux, ClickMonitorDDC, Monitorian, or any other display utility.
- Download
DisplayPal_Setup_1.2.0.exefrom Releases - Run the installer — choose install location, desktop icon, and auto-start options
- Launch from Start Menu or desktop shortcut
- The first-run dialog will check your system and guide you through setup
Windows SmartScreen: You may see a "Windows protected your PC" warning when running the installer. This is because the app is new and not yet code-signed. Click "More info" then "Run anyway". The source code is fully open for inspection on this repo. We are applying for a code signing certificate through SignPath Foundation.
- Download the portable zip from Releases
- Extract to a folder of your choice
- Run
DisplayPal.exe
- Clone this repository
- Install Python 3.10+
- Install dependencies:
pip install -r requirements.txt - Run:
pythonw main.py
| Method | Action |
|---|---|
| Tray menu | Right-click the tray icon, click a profile name |
| Hotkey | Ctrl+Alt+1 (Work), Ctrl+Alt+2 (Code), Ctrl+Alt+3 (Game), Ctrl+Alt+4 (Cinema) |
| Schedule | Automatic — configure in Settings > Schedule |
| Hotkey | Action |
|---|---|
| Ctrl+Alt+1 | Switch to Work profile |
| Ctrl+Alt+2 | Switch to Code profile |
| Ctrl+Alt+3 | Switch to Game profile |
| Ctrl+Alt+4 | Switch to Cinema profile |
| Ctrl+Alt+D | Quick Dim toggle (10% brightness) |
| Ctrl+Alt+L | Profile Lock toggle |
| Ctrl+Alt+P | Panic button (instant Work mode) |
| Ctrl+Alt+Shift+D | Disco mode (5 second easter egg) |
| Ctrl+Alt+Shift+Up/Down | Nudge brightness ±5% (fine) |
| Ctrl+Alt+Shift+PgUp/PgDn | Nudge brightness ±15% (coarse) |
| Ctrl+Alt+Shift+Left/Right | Nudge colour temperature ±200K |
Profile hotkeys are configurable in Settings > Profiles.
Right-click the tray icon and click Settings to open the configuration window:
- Profiles tab — Adjust brightness, colour temperature, refresh rate, and hotkey for each profile. Use "Revert to Default" to reset a profile.
- Schedule tab — Enable sunrise/sunset auto-switching (click "Detect" to set your location automatically) or add fixed time rules.
- Apps tab — Configure app-aware switching. Auto-detects games and productivity apps, or add custom rules to map any app to a profile. Choose which profile each category switches to.
- General tab — Auto-start, notifications, ambient mode, language, transition speed, hotkey reference, and current status.
- Stats tab — Visual bar charts showing time spent in each profile today and this week.
- About tab — App version, MouseWheel Digital branding, feedback email, Buy Me a Coffee link, and GitHub link.
When you manually select a profile (tray menu or hotkey), it automatically locks to prevent scheduled or ambient switches from overriding your choice. You'll see a red dot on the tray icon confirming the lock.
To return to automatic mode, either:
- Right-click the tray icon and click Unlock Profile
- Press Ctrl+Alt+L
- Select Ambient from the tray menu (auto-unlocks and enables ambient mode)
While locked:
- Scheduled, sunrise/sunset, and ambient switches are all blocked
- Manual switches (hotkey or tray menu) still work
- Lock resets on next app launch
Ambient mode gradually shifts colour temperature throughout the day following the sun's position — warm at night, neutral around noon. It's like f.lux but built in.
Right-click the tray icon and select Ambient to enable it (shows a checkmark when active). Ambient appears alongside the profiles in the tray menu, so you can quickly switch between a fixed profile and ambient mode.
Selecting a fixed profile (Work, Code, Game, Cinema) auto-locks and disables ambient adjustments. Selecting Ambient unlocks and lets the automatic colour shifting resume.
| Profile | Brightness | Colour Temp | Refresh Rate | Use Case |
|---|---|---|---|---|
| Work | 80% | 6500K (neutral) | 60 Hz | Documents, dashboards, video calls |
| Code | 50% | 5000K (warm) | 60 Hz | Dark theme coding, evening sessions |
| Game | 75% | 6500K (neutral) | 100 Hz | Colour accuracy, smooth gameplay |
| Cinema | 30% | 3500K (warm) | No change | Movie watching, cosy vibes |
All values are fully customisable per profile.
| Feature | Technology |
|---|---|
| Brightness | screen-brightness-control — DDC/CI for external monitors, WMI for laptops |
| Colour temperature | Win32 SetDeviceGammaRamp — same technique f.lux uses internally |
| Refresh rate | Win32 ChangeDisplaySettingsW — system-level display mode change |
| Sunrise/sunset | astral library — offline calculation, no internet needed after location is set |
| System tray | pystray |
| Settings UI | customtkinter |
| Global hotkeys | keyboard |
Settings are stored in config.json alongside the executable (or main.py if running from source). The file is created automatically on first run with sensible defaults. You can edit it directly, but the Settings UI is the intended way to configure everything.
"No displays found" or brightness not changing
- External monitors: Check that DDC/CI is enabled in your monitor's OSD settings. Try a different cable — some cheap HDMI cables don't carry DDC/CI signals.
- Laptops: Brightness control uses WMI which works on most laptops. If it doesn't work, check your display driver is up to date.
Colour temperature reverts immediately
- f.lux is probably running — close it. Both apps write the same gamma ramp and will fight each other.
Brightness doesn't change
- Some monitors have a DDC/CI setting buried in a submenu — check your monitor manual
- Try disconnecting and reconnecting the display cable
Tray icon not visible
- Click the "^" overflow arrow in the Windows taskbar — new tray icons are often hidden there
- Drag the icon out of overflow to pin it to the taskbar
Do I need any other software to use DisplayPal? No. DisplayPal is completely self-contained and controls your display directly through Windows APIs. You do not need f.lux, Monitorian, Twinkle Tray, ClickMonitorDDC, or any other display utility. If you have f.lux installed, you should close or uninstall it — both apps control the same gamma ramp and will conflict with each other.
Does it work on laptops? Yes. Brightness control works on laptop screens via WMI and on external monitors via DDC/CI. Colour temperature and refresh rate work on all displays.
What happens if I plug in a second monitor? DisplayPal detects all connected displays automatically. Brightness changes are applied to all monitors. Restart the app after connecting a new display for it to be detected.
Why does my screen go black briefly when switching to Game mode? This is standard Windows behaviour, not a DisplayPal issue. When your profiles use different refresh rates (e.g., 60Hz for Work, 100Hz for Game), Windows performs a full display mode change which momentarily blanks the screen. This happens with any application that changes the refresh rate. Switching between profiles with the same refresh rate is instant with no flash.
What does the red dot on the tray icon mean? Your profile is locked. This happens automatically when you manually select a profile (to prevent scheduled switches from overriding your choice). Right-click the tray icon and click "Unlock Profile" or press Ctrl+Alt+L to return to automatic mode.
What's the difference between Ambient mode and the sunrise/sunset schedule? The sunrise/sunset schedule switches between two fixed profiles at sunrise and sunset. Ambient mode is more gradual — it continuously adjusts colour temperature throughout the day (neutral at noon, warm in the evening, very warm at night) like a smooth curve rather than a hard switch.
Can I use both Ambient mode and fixed schedules? You can, but ambient mode will override the colour temperature set by a scheduled profile switch. For most people, pick one or the other.
What's Cinema mode for? It's a dedicated profile for watching movies or relaxing — low brightness (30%), warm colour temperature (3500K), and it doesn't change the refresh rate. Think of it as "cosy screen" mode.
What's the Panic button? Press Ctrl+Alt+P and it instantly switches to Work mode. Useful for... situations where you need to look productive quickly.
Is there really a Disco mode? Yes. Press Ctrl+Alt+Shift+D for 5 seconds of rapidly cycling colour temperatures. It's an easter egg. Your display settings are restored automatically after it finishes.
How does game detection work? DisplayPal uses four detection methods that work with any GPU vendor (NVIDIA, AMD, Intel): (1) Windows GameConfigStore registry — the OS already tracks what it considers a game, (2) Steam and Epic library scanning for installed game executables, (3) fullscreen + borderless window detection, and (4) checking if the foreground process has DirectX or Vulkan rendering DLLs loaded. When a game is detected, it auto-switches to your chosen Game profile. When you close the game, it reverts to whatever profile was active before.
Can it detect non-game apps too? Yes. Enable "Detect productivity apps" in Settings > Apps and it will recognise ~50 common apps including Microsoft Office, VS Code, Notepad++, browsers, Teams, Slack, Discord, Zoom, terminals, design tools, and more. You can also add custom rules for any app not on the built-in list. Detection priority: Custom rules > Games > Productivity apps.
Does the app phone home or collect data? No. Everything runs locally. The only network call is the optional one-click location detection (via ip-api.com) for setting up sunrise/sunset — and that only happens when you click "Detect" in Settings. Usage stats are stored locally in config.json and never leave your machine.
What's the difference between nudging and editing a profile? Nudges are temporary — they adjust your current display state immediately but don't save. On the next profile switch (manual, scheduled, ambient, or app-aware), the new profile's values take over and your nudges are lost. Profile edits in Settings are permanent — they change the stored values for that profile. Use nudges for quick "just right now" tweaks, edit profiles for permanent adjustments.
How do I know when there's an update? DisplayPal checks GitHub for new releases automatically each time it starts. If a newer version is available, you'll see a notification with a Download button that takes you to the releases page. No auto-downloading — you choose when to update.
What happens if the app crashes? On next launch, DisplayPal re-applies the last active profile, which resets the gamma ramp to the correct state. If the gamma ramp is stuck from a crash, just restart the app.
To create a standalone executable:
pip install pyinstaller
pyinstaller --noconfirm --windowed --name "DisplayPal" --icon "assets/icon.ico" --add-data "assets;assets" --add-data "lang;lang" --collect-all customtkinter --hidden-import pystray._win32 main.py
The output will be in dist/DisplayPal/. Zip the entire folder for the portable distribution.
To build the Windows installer, install Inno Setup 6 then compile installer.iss:
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer.iss
The installer will be created in installer_output/.
Translation files are simple JSON files in the lang/ folder. To add a new language:
- Copy
lang/en.jsontolang/xx.json(wherexxis the language code) - Translate all string values (leave keys and placeholders like
{name}unchanged) - Update the
_metasection with the language name and your name as author - Submit a pull request
Current languages: English, German (Deutsch), French (Francais), Spanish (Espanol), Japanese.
MIT License — see LICENSE for details.
DisplayPal is free and open source. If you find it useful and want to support development:
A MouseWheel Digital product
Digital products. Built with purpose.
Built with the assistance of Claude Code by Anthropic.
