A lightweight Windows application that dims inactive displays to highlight the active one. Built with pure Rust and Windows API for maximum performance.
npm install spotlight-dimmeralt + tab. It's specially useful for users who navigate mainly with the keyboard. It helps to avoid silly situations like typing terminal commands on Teams because you're looking at a screen while the focus is on the other screen.
%APPDATA%\spotlight-dimmer\config.toml
spotlight-dimmer-v*-installer.exe from the GitHub Releases page.
bash
npm install -g spotlight-dimmer
`
Requirements:
- Node.js 14 or higher
- Windows x64
The package includes pre-built binaries - no compilation needed! After installation, the commands spotlight-dimmer and spotlight-dimmer-config will be available globally.
Uninstall:
`bash
npm uninstall -g spotlight-dimmer
`
$3
If you prefer to build and install manually using Cargo:
`bash
cargo build --release --bin spotlight-dimmer --bin spotlight-dimmer-config
`
Binaries will be in target\release\:
- spotlight-dimmer.exe - Main application
- spotlight-dimmer-config.exe - Configuration tool
You can also use the PowerShell installation script:
`powershell
.\install.ps1
`
$3
#### Running the Application
If installed via Windows installer:
- Use the Start Menu shortcut: Start → Spotlight Dimmer
- The application will run with a system tray icon
If installed via npm, cargo, or portable zip:
`cmd
spotlight-dimmer.exe
`
The application will:
1. Load configuration from %APPDATA%\spotlight-dimmer\config.toml (or create default)
2. Add a system tray icon for quick access
3. Detect all connected displays
4. Create semi-transparent overlay windows on each display
5. Monitor active window focus and update overlay visibility
6. Run indefinitely until closed via system tray or Task Manager
#### Controlling the Application via System Tray
The system tray icon provides quick access to key functions:
- Double-click: Hide/show all overlays (pause/resume dimming)
- Right-click: Access the context menu with:
- Profile switching (quick-switch between saved profiles)
- Exit option to close the application
Alternative ways to stop the application:
`powershell
Using PowerShell
Get-Process spotlight-dimmer | Stop-Process
`
Or use Task Manager to end the spotlight-dimmer.exe process.
#### Configuration Tool
Use spotlight-dimmer-config.exe to manage all settings:
`cmd
Show current configuration
spotlight-dimmer-config status
Inactive overlay commands (dims non-active displays)
spotlight-dimmer-config enable # Enable inactive display dimming
spotlight-dimmer-config disable # Disable inactive display dimming
spotlight-dimmer-config color 0 0 0 0.7 # Set inactive overlay color (RGB 0-255, alpha 0.0-1.0)
Active overlay commands (highlights active display)
spotlight-dimmer-config active-enable # Enable active display overlay
spotlight-dimmer-config active-disable # Disable active display overlay
spotlight-dimmer-config active-color 50 100 255 0.15 # Set active overlay color
Partial dimming commands (dims empty areas around focused window)
spotlight-dimmer-config partial-enable # Enable partial dimming
spotlight-dimmer-config partial-disable # Disable partial dimming
Profile commands
spotlight-dimmer-config list-profiles # List all saved profiles
spotlight-dimmer-config set-profile dark-mode # Load and apply a saved profile
spotlight-dimmer-config save-profile my-setup # Save current settings as a profile
spotlight-dimmer-config delete-profile my-setup # Delete a saved profile
General commands
spotlight-dimmer-config reset # Reset to defaults
spotlight-dimmer-config help # Show all available commands
`
Note: Configuration changes are automatically detected and reloaded within 2 seconds. No restart needed!
Configuration File
Configuration is stored at %APPDATA%\spotlight-dimmer\config.toml:
`toml
is_dimming_enabled = true
is_active_overlay_enabled = false
is_paused = false
is_partial_dimming_enabled = false
Inactive overlay color (for non-active displays)
[overlay_color]
r = 0
g = 0
b = 0
a = 0.5
Active overlay color (for active display, optional)
[active_overlay_color]
r = 50
g = 100
b = 255
a = 0.15
Saved profiles (two default profiles: "light-mode" and "dark-mode")
[profiles.light-mode]
is_dimming_enabled = true
is_active_overlay_enabled = false
is_partial_dimming_enabled = true
[profiles.light-mode.overlay_color]
r = 0
g = 0
b = 0
a = 0.5
[profiles.dark-mode]
is_dimming_enabled = true
is_active_overlay_enabled = true
is_partial_dimming_enabled = true
[profiles.dark-mode.overlay_color]
r = 0
g = 0
b = 0
a = 0.7
[profiles.dark-mode.active_overlay_color]
r = 0
g = 0
b = 0
a = 0.3
`
Architecture
$3
- Memory usage: ~7.6 MB
- Binary size: 561 KB
- Implementation: Pure Windows API with Rust winapi crate
- Overlay technology: Layered windows (WS_EX_LAYERED) with alpha blending
- Focus monitoring: 100ms polling using GetForegroundWindow() and MonitorFromWindow()
$3
- Binary size: 627 KB
- Implementation: CLI tool using clap for argument parsing
- Configuration: TOML format via toml crate
$3
- Click-through: WS_EX_TRANSPARENT flag ensures overlays don't capture input
- Always on top: WS_EX_TOPMOST keeps overlays above other windows
- No taskbar: WS_EX_TOOLWINDOW prevents overlays from appearing in Alt+Tab
- No focus: WS_EX_NOACTIVATE prevents overlays from stealing focus
- Transparency: SetLayeredWindowAttributes() with LWA_ALPHA for smooth dimming
Development
$3
`
.
├── src/
│ ├── main_new.rs # Main application entry point
│ ├── config_cli.rs # Configuration CLI tool
│ ├── config.rs # Configuration system (TOML)
│ ├── overlay.rs # WinAPI overlay implementation
│ └── platform/
│ ├── mod.rs # Cross-platform traits
│ └── windows.rs # Windows display/window management
├── Cargo.toml # Rust dependencies
└── target/release/ # Build output
`
$3
`bash
cargo build --release
`
$3
- serde - Configuration serialization
- toml - TOML configuration parsing
- winapi` - Windows API bindings