Documentation
Version 1.1.0. Everything here is also in the repository README.
Install
One binary. The menu-bar app and the dsp command are the same executable, and installing puts a login item in place so the agent starts with your session.
curl -fsSL https://displayupscale.dfacto.ai/install | bashOr build it yourself — it needs only the Xcode command line tools, no package manager and no Xcode project:
git clone https://github.com/deepakmarathe/display-upscale cd display-upscale ./build.sh
./build.sh uninstall removes the login item, the app and the command, and keeps your settings.
The one concept
A mode is 1:1when its framebuffer matches the panel's real pixel grid, and downscaled when the framebuffer is larger. Downscaled is always softer: the GPU renders more pixels than the panel has and then resamples them down, so every glyph edge lands between physical pixels.
This is why forcing "HiDPI" onto a native 1080p monitor makes text duller, not sharper — you trade a 1:1 pixel mapping for a bilinear blur, and there are no extra pixels to win. It is also why dsp override refuses to generate an EDID override for a panel macOS is already driving fully.
CLI reference
<index> is the bracketed number from dsp list, not a display ID.
| Command | What it does | Tier |
|---|---|---|
| dsp doctor | Everything wrong with your displays, ranked, each with the command that fixes it. Exits non-zero when it finds a real problem, so it works in a script. | Free |
| dsp list [-a] | Every display: panel pixel size, current mode, and whether it is 1:1 or downscaled. `-a` also lists the downscaled modes normally hidden. | Free |
| dsp best <index> | Put one display on the sharpest mode at the UI size it already uses. | Free |
| dsp set <index> <WxH[@Hz]> | Switch to a specific mode. `--hidpi` or `--1x` forces a scale, for A/B comparison. | Free |
| dsp smooth [0-3] | Font smoothing strength. Needs a log out and back in — macOS reads it once at app launch. | Free |
| dsp pin <index> [WxH[@Hz]] | Remember a mode for that panel and re-apply it forever. No mode = unpin. | Pro |
| dsp auto on|off | Whether the agent fixes displays that have no pin. | Free |
| dsp desk save <name> | Snapshot this whole desk — every display's mode, brightness and contrast. | Pro |
| dsp desk list | apply | rm | List saved desks, re-apply one by hand, or delete it. The connected desk is marked. | Pro |
| dsp ddc <index|all> [ctl [v]] | The monitor's own controls over the cable: brightness, contrast, sharpness, red, green, blue, blacklevel. `all` covers every external display; v may be 50, +10 or -10. | Pro |
| dsp override <index> | Generate an EDID override for a panel macOS under-drives. Refused when the panel is already fully driven. | Pro |
| dsp license | Current plan, limits and what is unlocked. | Free |
| dsp activate <key> | Apply a licence key or a full activation link. | Free |
| dsp deactivate | Remove the licence from this Mac. The key keeps working elsewhere. | Free |
| dsp selftest | Assert the mode-picking logic against your actual displays. | Free |
Every dsp ddc write prints its own undo command with the previous value.
What each tier unlocks
Diagnosis and manual fixes are free on every tier. Paid tiers automate them and add the hardware controls.
Free
- 1 display managed
- 1 device
- Pinned profiles: no
- DDC controls: no
- EDID overrides: no
- Desk profiles: no
Pro
- 8 displays managed
- 3 devices
- Pinned profiles: yes
- DDC controls: yes
- EDID overrides: yes
- Desk profiles: yes
Studio
- 16 displays managed
- 10 devices
- Pinned profiles: yes
- DDC controls: yes
- EDID overrides: yes
- Desk profiles: yes
These numbers come from the same file the application reads, so this table cannot drift from what the binary enforces.
Licences
Every install starts with 14 days of Pro — no card, no account. When it ends the app returns to Free; nothing breaks and your displays stay where they are.
A licence is an Ed25519-signed token verified against a key compiled into the application. There is no licence server, so activation works offline and a provider outage cannot lock you out. Activate by clicking the link in your receipt, pasting the key into the menu-bar app, or:
dsp activate 'DU1.…' dsp license # what is active now dsp deactivate # release this Mac
The key is stored at ~/Library/Application Support/dsp/license.token and nowhere else.
Supported versions
A row appears here only when it has actually been run. "Should work" is not a support commitment.
macOS
- SupportedmacOS 26 (Tahoe)
Developed and tested on this release.
- SupportedmacOS 15 (Sequoia)
Same APIs; DDC path unchanged.
- SupportedmacOS 14 (Sonoma)
Minimum for the private IOAVService DDC symbols to be present.
- Security fixes onlymacOS 13 (Ventura)
Runs, and mode switching works. DDC is not exercised on this release — the app reports it as unavailable rather than guessing.
- End of lifemacOS 12 and earlier
Below the build's deployment target; the app will not launch.
Hardware
- SupportedApple Silicon (M1–M5)
The DDC path is written against Apple Silicon's IOAVService and is what all testing runs on.
- Security fixes onlyIntel Macs
Mode listing, mode switching and the agent work. DDC uses a different IOKit path on Intel and is reported as unavailable rather than half-working.
- SupportedBuilt-in Retina displays
Detected as built-in; EDID overrides are refused for them by design.
- SupportedExternal displays over DisplayPort / USB-C
Including DDC, when the cable path passes I2C through.
- SupportedDisplays behind a hub or KVM
Modes and the agent work. Many hubs do not pass I2C, so DDC may be unavailable — the app says so instead of failing silently.
Support window: the current minor release is supported, the one before it receives fixes for anything that blocks a launch or loses settings, and older releases are end of life. Small enough that we can actually honour it.
Releases
- 1.1.02026-08-04Supported
- `dsp doctor` — one command that finds everything wrong with your displays, ranked, with the fix for each. Free on every tier.
- Desk profiles: name the set of displays in front of you and every mode, brightness and contrast returns automatically when they reappear (Pro)
- `dsp ddc all` sets every external display at once, and values accept +N / -N steps
- Fixed: a DDC write did not wait the mandated 50ms before the next command, so the command after any write was silently dropped by the panel
- 1.0.02026-08-04Security fixes only
- Menu-bar agent that keeps every managed display on its sharpest 1:1 mode
- Pinned per-display profiles that survive sleep, replug and reboot
- Monitor controls over DDC/CI — brightness, contrast, sharpness, colour
- EDID override generation, refused for panels macOS already drives fully
- Offline licence verification; Free, Pro and Studio tiers
Troubleshooting
dsp: command not found
The command lives at ~/.local/bin/dsp. Add that directory to your PATH, or call it by full path.
DDC says the monitor has no channel
Many hubs, KVMs and some USB-C adapters do not pass I2C through. Try the monitor plugged straight into the Mac. The app reports this rather than guessing, because a DDC write to the wrong bus is how other tools dim the wrong screen.
The agent is not running
launchctl print gui/$(id -u)/ai.dfacto.dsp shows its state, and /tmp/ai.dfacto.dsp.log records every mode it changed and when.
A display keeps going soft after sleep
That is exactly what the agent is for — make sure that display is one of the managed ones (menu-bar icon → the display → “Keep this display sharp”). On the Free tier only one display is managed at a time.
I pinned a mode and it stopped being applied
Pinning is a Pro feature. If a licence lapsed, pins are ignored but never deleted — renewing brings every profile back untouched.
Anything else: support@dfacto.ai, or open an issue on GitHub. We reply within 2 business days.