Skip to content

Instantly share code, notes, and snippets.

@ejdyksen
Last active October 15, 2025 17:35
Show Gist options
  • Save ejdyksen/8302862 to your computer and use it in GitHub Desktop.
Save ejdyksen/8302862 to your computer and use it in GitHub Desktop.
A script to fix EDID problems on external monitors in macOS

patch-edid.rb

A script to fix EDID problems on external monitors in macOS.

Instructions

  1. Connect only the problem display.

  2. Create this directory structure (if it doesn't already exist):

    sudo mkdir -p /Library/Displays/Contents/Resources/Overrides
  3. Download this ruby script in that directory:

    cd /Library/Displays/Contents/Resources/Overrides
    sudo curl -O https://gist.githubusercontent.com/ejdyksen/8302862/raw/patch-edid.rb

    Note: You may want to use adaugherity's version of the script instead.

  4. Run the script we just downloaded (as root again). This creates a new display override plist file.

    cd /Library/Displays/Contents/Resources/Overrides
    sudo ruby patch-edid.rb
  5. Unplug and replug in the problem display.

Additional reading/acknowledgements

  • The original forum thread
  • An improved version of the script by adaugherity
  • An explaination of the problem from Atomic Object's blog
  • Thanks so much to @stackrainbow for pointing out that this can be done without disabling SIP.
  • This version appears to work in Catalina and Big Sur. See earlier revisions for what worked (with disabling SIP) in earlier versions of macOS, which require the override plist to be in a different directory.
#!/usr/bin/ruby
# Create display override file to force Mac OS X to use RGB mode for Display
# see http://embdev.net/topic/284710
#
# Update 2013-06-24: added -w0 option to prevent truncated lines
require 'base64'
data=`ioreg -l -w0 -d0 -r -c AppleDisplay`
edid_hex=data.match(/IODisplayEDID.*?<([a-z0-9]+)>/i)[1]
vendorid=data.match(/DisplayVendorID.*?([0-9]+)/i)[1].to_i
productid=data.match(/DisplayProductID.*?([0-9]+)/i)[1].to_i
puts "found display: vendorid #{vendorid}, productid #{productid}, EDID:\n#{edid_hex}"
bytes=edid_hex.scan(/../).map{|x|Integer("0x#{x}")}.flatten
puts "Setting color support to RGB 4:4:4 only"
bytes[24] &= ~(0b11000)
puts "Number of extension blocks: #{bytes[126]}"
puts "removing extension block"
bytes = bytes[0..127]
bytes[126] = 0
bytes[127] = (0x100-(bytes[0..126].reduce(:+) % 256)) % 256
puts
puts "Recalculated checksum: 0x%x" % bytes[127]
puts "new EDID:\n#{bytes.map{|b|"%02X"%b}.join}"
Dir.mkdir("DisplayVendorID-%x" % vendorid) rescue nil
f = File.open("DisplayVendorID-%x/DisplayProductID-%x" % [vendorid, productid], 'w')
f.write '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">'
f.write "
<dict>
<key>DisplayProductName</key>
<string>Display with forced RGB mode (EDID override)</string>
<key>IODisplayEDID</key>
<data>#{Base64.encode64(bytes.pack('C*'))}</data>
<key>DisplayVendorID</key>
<integer>#{vendorid}</integer>
<key>DisplayProductID</key>
<integer>#{productid}</integer>
</dict>
</plist>"
f.close
@adam-electric
Copy link

and downloaded the LATEST DRIVERS from the Display Link adapter from J5CREATE, and my 3rd monitor is HARDCORE LAGGY. - This 3rd Monitor is Connected not as Apple Intended to (laggy)

DisplayLink uses USB and compressed video. The USB is less than 5 Gbps. A 4K60 display is usually 16 Gbps. The CPU is used to compress the video so it may be laggy. DisplayLink does not use the GPU of the Mac so it can connect any number of displays but they won't perform like they were connected to a GPU.

So then i don't need to do any patches right? thats were i am super confused about patching it. Seems the patches work completely fine and fluidly on intel based computers. So i dont know if theres a firmware to limit that fluid on the third monitor. So how were you able to find its a 5GB usb c cable? The monitor i use its a 1080p for gaming. I dont have any 4K monitors due to that issue. i know it takes more data from it if its 4K unless i am wrong.

So my question is, Is there a way to be able to overpass that 16GB by usb-c per se idk if theres a MULTI MONITOR WITH DISPLAY LINK RUNNING AT 20GBPS not sure i really never done this before.

Its my first time and im doing research, i searched on google and amazon but seems lots of people complain about this type of items.

So i dont know if there is a possibility to be able to overcome that lag.

I am sorry i am a complete noob. I hope i am able to understand more about this.

Thank you!

@joevt
Copy link

joevt commented Aug 15, 2025

Look for the DisplayLink USB device in System Information.app. DisplayLink uses USB 3.0. USB 3.0 is ≈ 4 Gbps (5 Gbps times 8/10 for the 8b10b encoding = 4 Gbps).

Video data rate is pixel clock times bits per pixel. 4K60 usually has a pixel clock of 533 MHz. 533 million pixels per second x 30 bits per pixel = 15.9 billions bits per second (Gbps). The CPU must compress video to transmit to the DisplayLink video controller at reasonable refresh rates (60 Hz).

I don't think there are any faster DisplayLink devices. The CPU is doing all the work. A faster DisplayLink would require the CPU to do more work.

To lessen the work required by the CPU, reduce the resolution and/or refresh rate.

@adam-electric
Copy link

Look for the DisplayLink USB device in System Information.app. DisplayLink uses USB 3.0. USB 3.0 is ≈ 4 Gbps (5 Gbps times 8/10 for the 8b10b encoding = 4 Gbps).

Video data rate is pixel clock times bits per pixel. 4K60 usually has a pixel clock of 533 MHz. 533 million pixels per second x 30 bits per pixel = 15.9 billions bits per second (Gbps). The CPU must compress video to transmit to the DisplayLink video controller at reasonable refresh rates (60 Hz).

I don't think there are any faster DisplayLink devices. The CPU is doing all the work. A faster DisplayLink would require the CPU to do more work.

To lessen the work required by the CPU, reduce the resolution and/or refresh rate.

yes i found it it shows up to 5gbps oh well so not much we can do about that. Well thank you very much for your help at least now i know that there is no solution to this.

it is what it is.

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment