Documentation
Version 1.3.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 never adds detail: the GPU renders more pixels than the panel has and then resamples them down, so every glyph edge lands between physical pixels.
Landing on one by accident — after sleep, a dock or a KVM — is the fault this app is named after, and dsp best is the way out. It is also why dsp override refuses to generate an EDID override for a panel macOS is already driving fully.
Choosing one on purpose is a different thing: supersampling, the same idea as SSAA, DSR or VSR. macOS only rasterises at 1x or 2x, so on a 1080p panel every UI size except 1920×1080 itself is drawn by the 1x rasteriser — jagged, and without subpixel antialiasing since Mojave. Render that desktop at 2x and resample it down and you get the 2x glyph rasteriser and four samples per output pixel instead of one. You gain coverage, not detail: edges soften, and 1px hairlines are the visible cost. dsp super does it, dsp list says which of the two you are on, and the framebuffer is capped at 2x the panel per axis.
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 super <index> [WxH|off] | The opposite trade: render above the panel and let the GPU resample down — the 2x glyph rasteriser and four samples per pixel instead of one. Where macOS offers no above-panel mode (any fully-driven panel on Apple Silicon), it renders on a virtual display bonded to that panel instead, with no reboot and no EDID override. External displays only, and the menu-bar agent holds it. `off` returns to the panel’s own mode. | 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|all> [--super] | Generate an EDID override for a panel macOS under-drives. Refused when the panel is already fully driven — unless `--super`, which is the deliberate opposite: it adds the above-panel modes `dsp super` needs. `all` covers every external display in one pass, deduplicated by vendor+product, since one file already applies to every identical monitor. | 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.3.02026-09-21Supported
- Your macOS display arrangement is honoured, whether Display Upscale is running or not. Drag your screens in System Settings and it sticks — while the app is open, and after reopening it
- macOS keeps a separate arrangement for each set of displays connected. The app now follows the one you are actually using instead of re-imposing its own record
- "Lock display arrangement" now means what people expected: your desk comes back after a replug, a wake or a login, and stays changeable the rest of the time
- Fixed: rearranging displays while the app was open was undone within half a second, and an arrangement set with the app closed was thrown away the next time it opened
- 1.2.02026-09-02Security fixes only
- `dsp super` — supersample a 1080p external panel through a virtual display: the desktop stays the same size, rendered at 2x and resampled down. Every route is in the menu, and the panel keeps its own colour primaries and profile
- Curated colour profiles per display, assigned reversibly from the menu
- Backup, revert and undo of every display setting, and a locked arrangement nothing can write over
- Brightness, contrast and sharpness sliders in the menu, per monitor; the menu-bar mark is coloured and animates on change
- `dsp doctor` finds an HDCP link stuck renegotiating — the cause of coloured squares on a panel — and the agent snapshots its health and memory pressure to ~/Library/Logs/dsp.log
- Fixed: ColorSync spinning a core on ghost display identities (pruned at every agent start); a 75Hz panel landing on 800x600 when supersampled; two menu-bar agents after a reinstall
- 1.1.02026-08-04End of life
- `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-04End of life
- 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.