Linux Color Management for Professionals
Set up a professional Linux color management pipeline using colord, ArgyllCMS, and DisplayCAL to calibrate your display and ensure consistent ICC color across GIMP, Darktable, and Scribus.
Before you start
- ▸A hardware colorimeter (X-Rite i1Display, Datacolor Spyder, or similar) connected via USB
- ▸A desktop environment with colord support (GNOME, KDE Plasma, or XFCE with colord plugin)
- ▸Python 3.9 or newer installed for DisplayCAL (pipx recommended)
- ▸Sudo or root access for package installation and udev rule management
Color accuracy matters the moment your work leaves the screen — whether you're retouching photographs, preparing print-ready PDFs, or grading video. Linux has a complete, professional color management stack built around colord, ICC profiles, and the DisplayCAL calibration suite. When everything is wired together correctly, applications like GIMP, Darktable, Inkscape, and Scribus all draw from the same calibrated profile, giving you consistent, predictable color from capture to output.
How Linux Color Management Works
The stack has three layers:
- colord — a system D-Bus service that stores ICC profiles and maps them to display and printer devices. It is the single source of truth for which profile belongs to which device.
- The compositor / display server — applies the calibration LUT (Look-Up Table) to the GPU's gamma ramps. Under Wayland (KDE Plasma 6+, GNOME 46+) this happens inside the compositor directly. Under X11,
xcalibordispwinloads the LUT into the X server at login. - Color-managed applications — query colord (or read the
_ICC_PROFILEX atom) and use a CMM (Color Matching Module) such as LittleCMS 2 to perform soft-proofing and gamut-mapped rendering.
DisplayCAL is a Python/wxPython front-end to ArgyllCMS. ArgyllCMS does the actual hardware communication and profile math; DisplayCAL provides a usable GUI and sane defaults.
Install colord
colord is almost certainly already running on a GNOME or KDE desktop. Verify:
systemctl status colord.service
If it is not installed:
# Debian / Ubuntu
sudo apt install colord colord-gtk
# Fedora / RHEL 9+ / Rocky
sudo dnf install colord colord-gtk
# Arch
sudo pacman -S colord
colord is a D-Bus activated service; it starts on demand and does not need to be explicitly enabled in most cases. If you need it to start unconditionally:
sudo systemctl enable --now colord.service
Install ArgyllCMS and DisplayCAL
ArgyllCMS
ArgyllCMS must be installed system-wide because DisplayCAL invokes its binaries directly. The distro package is usually recent enough:
# Debian / Ubuntu
sudo apt install argyll
# Fedora / RHEL (EPEL required on RHEL/Rocky)
sudo dnf install argyllcms
# Arch
sudo pacman -S argyllcms
DisplayCAL
The legacy displaycal package available in some repos targets Python 2 and is effectively dead. Use the actively maintained DisplayCAL 3 fork from PyPI, which supports Python 3.9+:
pip install --user displaycal
On systems with strict pip policies (Debian 12+, Ubuntu 23.04+) use a virtual environment or pipx:
pipx install displaycal
After installation the launcher is at ~/.local/bin/displaycal. Make sure ~/.local/bin is in your PATH.
Grant Your User Access to the Colorimeter
USB colorimeters (X-Rite i1Display, Datacolor Spyder, etc.) require udev rules to be accessible without root. ArgyllCMS ships the rules; ensure they are active:
# Debian / Ubuntu — rules land in /lib/udev/rules.d/55-Argyll.rules automatically
# Confirm:
ls /lib/udev/rules.d/55-Argyll.rules
# Reload if just installed:
sudo udevadm control --reload-rules && sudo udevadm trigger
Add your user to the group that owns the device node. On most distros with udev rules in place, group membership is not required, but if spotread -? fails with a permissions error:
sudo usermod -aG plugdev $USER # Debian/Ubuntu
# Log out and back in for group membership to take effect
On Fedora/Arch the udev rules grant direct access; no group change is needed.
Calibrate and Profile Your Display
Pre-calibration setup
Warm up the monitor for at least 30 minutes. Set brightness and contrast to your intended working values on the OSD — do this before profiling, because DisplayCAL measures the display as-is and embeds those characteristics in the profile. Do not change brightness/contrast after profiling.
Running DisplayCAL
displaycal
Key settings for a professional workflow:
- Display technology: select your panel type (LCD, OLED, etc.).
- Instrument: DisplayCAL auto-detects connected colorimeters. Confirm it shows your device.
- White point: D65 (6500 K) for photography and general print work; D50 for strict pre-press.
- Tone curve: sRGB for most monitors; Gamma 2.2 is equivalent for display profiling; use BT.1886 for video grading.
- Profile type: Single curve + matrix is fast and sufficient for wide-gamut sRGB monitors. Use LUT + matrix for wide-gamut displays or when soft-proofing CMYK.
- Patch set: 256 patches for a quick profile; 1024+ for publication-quality work.
Click Calibrate & Profile. DisplayCAL runs calibration first (adjusting LUT curves), then measures the patch set to build the profile. A full 1024-patch run takes 30–90 minutes depending on instrument speed.
Installing the profile into colord
DisplayCAL can do this automatically. After profiling, go to Profile Information → Install profile. This copies the .icc file to ~/.local/share/icc/ and registers it with colord via D-Bus. You can verify:
colormgr get-devices
The output will list your display device with an associated profile path. To install a pre-existing profile manually:
cp MyProfile.icc ~/.local/share/icc/
colormgr import-profile ~/.local/share/icc/MyProfile.icc
Apply the Calibration LUT at Login
Wayland (GNOME 46+, KDE Plasma 6+)
Modern compositors read the colord-assigned profile automatically and apply the gamma LUT. No extra configuration is needed. Confirm GNOME is using it:
gnome-control-center color
Under KDE Plasma 6, check System Settings → Color & Display → Color Profile.
X11 sessions
Under X11 the LUT must be loaded each login. DisplayCAL installs a dispwin call into autostart, but you can also do it manually. Create a systemd user service:
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/icc-lut.service << 'EOF'
[Unit]
Description=Load ICC calibration LUT into X11
After=graphical-session.target
[Service]
Type=oneshot
ExecStart=/usr/bin/dispwin -d1 %h/.local/share/icc/MyProfile.icc
[Install]
WantedBy=graphical-session.target
EOF
systemctl --user enable --now icc-lut.service
Replace MyProfile.icc with your actual profile filename. The -d1 flag targets the first display; use -d2 for a second monitor.
Configuring Color-Managed Applications
GIMP 2.10 / 3.x
Go to Edit → Preferences → Color Management. Set the Monitor profile to Get profile from colord/GSD (GIMP 2.10+). Set rendering intent to Relative Colorimetric with black-point compensation for print work.
Darktable
Darktable queries colord automatically for the display profile. Verify in Preferences → Processing → Display profile — it should show your profile name, not "system default." For soft-proofing, enable the soft-proof module in the darkroom and select your printer's CMYK profile.
Inkscape 1.x
Inkscape uses LittleCMS 2. Under File → Document Properties → Color, set the document color profile (e.g., sRGB IEC61966-2.1). Display color correction is on by default and reads the system profile from colord on Linux.
Scribus 1.5+
Scribus has the most complete CMYK workflow on Linux. Go to Edit → Preferences → Color Management, enable it, and set your RGB, CMYK, and printer profiles. Scribus also handles PDF/X-1a and PDF/X-3 output with embedded profiles for pre-press delivery.
Verify the Full Pipeline
Open a known-good test image (download the Argyll test.tif or use the ECI/ISO test chart) in both a color-managed viewer and an unmanaged one. Colors should look consistent in managed apps and shifted in unmanaged ones — that shift is the proof the pipeline is active. Check colord's view of your display device:
colormgr get-device-profiles $(colormgr get-devices | grep -oP 'Device ID:\s+\K\S+'| head -1)
The output should reference your installed .icc file path.
Troubleshooting
- colord not finding the display: Under Wayland, GNOME's
gsd-colorplugin acts as the colord client. Ensure it is running:pgrep gsd-color. Under KDE, the equivalent iskded6with the colord module loaded. - DisplayCAL cannot open the instrument: Run
dmesg | tail -20after plugging in the colorimeter. If permission is denied, confirm the udev rules loaded (udevadm info /dev/usb/...) and that you have reloaded rules since installation. - Profile appears gray/wrong after loading: A corrupted profile build can happen if the monitor drifted during measurement or if room lighting changed. Re-run the calibration from scratch.
- Application ignores the profile: Confirm the app is built with LittleCMS 2 support (
ldd $(which gimp) | grep lcms). Some Flatpak builds of apps do not see~/.local/share/icc/— add the path to the Flatpak override:flatpak override --user --filesystem=~/.local/share/icc. - Gamma LUT not loading on multi-monitor X11: Run
dispwinonce per display head with the appropriate-dnumber.
Frequently asked questions
- Does color management work under Wayland, or do I need X11?
- Wayland support is now solid on GNOME 46+ and KDE Plasma 6+, both of which apply calibration LUTs via the compositor using the colord profile. X11 still works and requires loading the LUT manually via dispwin or xcalib at login.
- Can I use a factory ICC profile instead of measuring my own?
- Yes, manufacturer profiles are better than nothing, but they represent an average unit and do not account for your specific panel's aging or the temperature it was measured at. A hardware-measured profile is always more accurate.
- How often should I re-calibrate my monitor?
- For critical work, monthly recalibration is a reasonable baseline. LCD backlights drift noticeably over the first few hundred hours of use and more slowly afterward. OLED panels can shift faster due to differential aging.
- My Flatpak version of GIMP or Darktable does not see my ICC profiles. Why?
- Flatpak sandboxes filesystem access. Run 'flatpak override --user --filesystem=~/.local/share/icc' for the affected app, then restart it. The app should then be able to read profiles from that directory.
- What is the difference between calibration and profiling?
- Calibration adjusts the display hardware (via GPU gamma ramps or OSD controls) to hit a target state. Profiling measures the resulting color behavior and creates an ICC file that describes it. Both steps together are what DisplayCAL calls 'Calibrate & Profile'.
Related guides
Linux Clipboards Explained (+ Clipboard Managers)
Learn the difference between Linux's PRIMARY and CLIPBOARD selections, use xclip, xsel, and wl-clipboard from the terminal, and manage history with GPaste or Klipper.
Configure LibreOffice for Daily Use
Configure LibreOffice for daily use: set default save formats for MS Office interop, tune autosave, install fonts, and add productivity extensions.
Configure the Touchpad and Multitouch Gestures
Configure Linux touchpad behavior and multitouch gestures using libinput, libinput-gestures, and native GNOME and KDE Plasma settings on both Wayland and X11.
Wayland vs X11: How to Choose and Configure Each
Know when to run Wayland or X11, how to check your current session, switch at login with GDM/SDDM/LightDM, and handle NVIDIA and XWayland edge cases.