$linuxjunkies
>

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.

AdvancedUbuntuDebianFedoraArch12 min readUpdated June 7, 2026

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, xcalib or dispwin loads the LUT into the X server at login.
  • Color-managed applications — query colord (or read the _ICC_PROFILE X 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-color plugin acts as the colord client. Ensure it is running: pgrep gsd-color. Under KDE, the equivalent is kded6 with the colord module loaded.
  • DisplayCAL cannot open the instrument: Run dmesg | tail -20 after 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 dispwin once per display head with the appropriate -d number.
tested on:Ubuntu 24.04Fedora 40Arch rollingDebian 12

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