ChromIQ is a five-step workbench for building custom ICC profiles for your RGB inkjet printer — powered by ArgyllCMS, wrapped in a macOS and Windows interface that never asks you to open Terminal.
This manual walks you end-to-end: installing the app, generating a test chart, printing it, measuring with your spectrophotometer, building the profile, and refining it until the colour you see on paper matches the colour you see on screen. Read it front-to-back the first time. After that, jump to whichever step is giving you trouble — each chapter stands on its own.
A friendly front-end for a serious piece of colour science — so you can stop memorising CLI flags and start printing things that look the way they should.
Every printer lies a little. Send the same RGB triple to two different machines and you'll get two noticeably different greens, two different skin tones, two different blacks. An ICC profile is the translation table that teaches your Mac how your specific printer, on this specific paper, with this specific ink, actually reproduces colour — so Lightroom, Photoshop, and ColorSync can compensate before the print leaves the nozzle.
Building that translation table by hand is tedious. You generate a random test chart, print it, measure every single patch with a spectrophotometer, then feed the results back through half a dozen command-line tools. Miss a flag and you have to start over. ChromIQ is the macOS app that does the tedious parts for you while leaving every knob accessible when you need it.
targen, printtarg, and colprof flag with tooltips that explain what each one actually does.profcheck tells you the average and peak ΔE and points out exactly which strips to re-measure.
ChromIQ is a GUI, not a colour engine. All of the actual heavy lifting — random target generation, spectral measurement, profile construction — is done by ArgyllCMS by Graeme Gill, which you install separately. ChromIQ's job is to keep you out of Terminal and stop you losing track of which .ti2 goes with which .ti3.
Two downloads, one preferences check, and you're ready to generate a chart.
ChromIQ calls out to four ArgyllCMS binaries: targen, printtarg, chartread, and colprof. Download ArgyllCMS 3.5.0 from argyllcms.com/downloaddev.html, unpack the archive, and move the Argyll_V3.5.0 folder into /Applications/. The default location ChromIQ looks for is:
# ChromIQ looks here first — you can change the path in Preferences. /Applications/Argyll/bin/ targen printtarg chartread colprof profcheck …and the rest of the Argyll toolset
Open the latest GitHub release and grab one of:
ChromIQ-macOS-universal.dmg — one binary for Apple Silicon and Intel.ChromIQ-macOS-arm64.dmg — smaller, Apple Silicon only.Open the DMG, drag ChromIQ to Applications, eject the image. Because the app is ad-hoc signed rather than notarized, macOS will refuse the first launch if you double-click. Right-click the app in Applications → Open → Open to clear Gatekeeper once — every launch after that is a normal double-click.
/Applications, not from inside the mounted DMG. macOS App Translocation will crash the app on launch otherwise.
ChromIQ-Windows-x64.zip — 64-bit Intel / AMD (most PCs).ChromIQ-Windows-arm64.zip — ARM64 (e.g. Snapdragon X laptops).
Extract the ZIP, open the ChromIQ folder, and run ChromIQ.exe. Windows SmartScreen may warn on first launch — click More info → Run anyway. ArgyllCMS is auto-detected in C:\Program Files\ArgyllCMS\bin and %LOCALAPPDATA%\ArgyllCMS\bin; download it from argyllcms.com (win64).
On first launch ChromIQ auto-detects the Argyll binaries. If it can't find them, a setup banner appears at the top of the window with a direct download link. Either way, open ChromIQ ▸ Preferences ⌘, and confirm the path:
/Applications/Argyll/bin).targen, printtarg, chartread, colprof.~/ChromIQ/ is fine; each session creates its own subfolder inside it.If you want to hack on ChromIQ or run it without a DMG:
git clone https://github.com/itsab1989/ChromIQ.git cd ChromIQ python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt python main.py
Python 3.12+ and PyQt6 ≥ 6.11 are required. Full build instructions live in HOW_TO_BUILD.txt at the repo root.
Your first profile in five steps. Set aside about an hour of active time, plus a drying gap between printing and measuring.
Open the 1. Create Chart tab. Leave the mode on Guided for your first run. Give the target a name, pick the Instrument you own, the Paper size you'll print on, and the Number of pages — usually 1 or 2.
ChromIQ looks up the maximum patch count that will fit and shows it in big cyan type under Calculated Patches. Click Generate Chart. The TIFF preview appears on the right once targen and printtarg finish.
Switch to 2. Print Chart. Pick your printer from the dropdown (click the ↺ next to it if it's missing). Set paper slot, media type, and print quality to exactly the settings you plan to use with this profile in production.
Click Print Current Page, or Print All Pages if you're doing a multi-page chart. On macOS, ChromIQ sends the chart via a PostScript Level 2/3 pipeline with colour management disabled automatically — no driver settings need changing. On Windows, the native print dialog opens; disable ICM in the driver before printing.
Connect your spectrophotometer, then open 3. Measure. The .ti2 file from Step 1 is already loaded — you should see its path next to Target File. Click Start Measurement.
A dialog walks you through calibration. When it closes, put the instrument at the top-left of strip A and follow the on-screen navigation:
On 4. Build Profile the .ti3 measurement file from Step 3 is already loaded. For a first pass the defaults are fine: Lab cLUT algorithm, Medium quality, Perceptual + Saturation gamut mapping with sRGB as the reference source.
Click Build Profile. A progress bar appears while colprof runs (20 seconds to a few minutes depending on quality). When it finishes, a dialog offers three next steps:
.icm in ColorSync so Photoshop, Lightroom, and Preview can see it immediately.The final tab runs profcheck against your measurements and grades the profile with average and peak ΔE numbers. If you're below ΔE 1.5 avg and ΔE 3.0 peak, ship it. If not, ChromIQ flags the worst strips and offers a guided re-measurement.
Click Guide Me Through Refinement. ChromIQ navigates to each flagged strip one at a time, you re-measure only those, then return to Step 4 and rebuild. Repeat until you're happy — usually one or two passes.
And that's it — you now have a custom ICC profile for your exact printer / paper / ink combination, installed on your Mac, ready to select as the destination profile in your editor of choice.
What each tab does, what every checkbox means, and where the app hides the details.
The Create Chart tab has two modes that share the same preview pane.
Pick an Instrument, a Paper size, and a Number of pages. ChromIQ consults its empirical patch-capacity database (stored in data/patch_db.py, measured with Argyll 3.5.0 at 300 DPI) and shows the optimal patch count instantly. The combination of fixed values it applies is printed in green below the inputs, for full transparency:
Guided mode applies these fixed settings: targen -d2 -G -e6 -B6 -g14 printtarg -iCM -pA4 -t300 -L -h chart
Every targen and printtarg flag is exposed as a labelled widget with a tooltip popover that explains what it does in plain English. The form is auto-generated from data/parameters.yaml, so whatever version of the app you're running matches its own Argyll binding exactly. Expert-only parameters are collapsed behind a disclosure.
For extended-gamut printers (e.g. CMYK + Orange + Green + Light Cyan), the Add/Remove Colorant (-D) expert option supports up to 11 cascading slots — enabling one slot reveals the next. All values and enabled states are saved with presets and Save Defaults.
The TIFF preview on the right displays RGB, CMYK, and extended-gamut TIFFs with up to 11 ink channels. CMYK is converted to sRGB using US Web Coated SWOP v2 for accurate colour rendering. A .channels.json sidecar written alongside each chart file preserves ink-channel order across sessions so re-loading always shows the correct colours.
| Code | Instrument | Notes |
|---|---|---|
i1 | X-Rite i1Pro / i1Pro 2 / i1Pro 3 | The workhorse. A3 portrait is hidden in guided mode (always use A3 landscape). |
p3 | X-Rite i1Pro 3 Plus | Much lower patch-per-sheet count than i1Pro. Database updated in v1.1.5. |
CM | X-Rite ColorMunki / i1Studio / ColorChecker Studio | Supports double-density (-h) when used with a measuring rig. |
SS | X-Rite SpectroScan (flatbed XY) | Fully automatic — still slow. |
A2 · A3+ · A3 · A3 Landscape · A4 · A4 Landscape · Tabloid (11×17) · Legal · Letter · Letter Landscape · 8×10" · 5×7" · 4×6" · Custom (W×H mm)
Photo formats (5×7" and 4×6") are hidden for i1Pro 3 Plus in Guided mode — patch counts are too low for a usable profile at those sizes. The Custom option reveals two numeric fields whose values are passed directly to printtarg as -pWxH.
Detected printers come straight from CUPS via the pycups API (more reliable across locales than parsing lpstat). ChromIQ exposes only the print options that actually exist on your specific driver — options unlock sequentially so you can't pick incompatible combinations (Epson EPIJ rules, PPD UIConstraints, and generic keyword heuristics are all honoured).
ChromIQ sends charts via a PostScript Level 2/3 pipeline rather than raw TIFF. The PS document embeds device-dependent colour spaces (/DeviceRGB, /DeviceCMYK, /DeviceN) and the %cupsJobTicket: cups-disable-cmm header, so CUPS and macOS ColorSync apply zero colour transforms — the pixel values that leave the app are exactly the values the spectrophotometer will measure. 16-bit profiling targets (printtarg -T300) are printed as PostScript Level 3 with 16-bit colour components for printers and RIPs with a true 16-bit pipeline.
CMYK and multi-channel (DeviceN) profiling targets with 4–17 channels are fully supported — previously all targets were force-cast to DeviceRGB by CUPS, corrupting CMYK and multi-ink patch data.
Some printers (e.g. Epson EcoTank via AirPrint) reject PostScript at the CUPS level. ChromIQ detects this automatically and retries with the original TIFF using colour-space-aware CUPS raster options (cupsColorSpace, ColorModel) — bypassing ColorSync without requiring PostScript support on the printer. No user action needed.
When a printer has no configurable driver options (AirPrint/driverless), a prominent notice explains how to reinstall the printer with the manufacturer's native PPD driver for best results.
Enable Preferences → Behaviour → Use default macOS printer dialog to replace the built-in PostScript/CUPS pipeline with the standard macOS print sheet. When active, the tab shows per-brand instructions for disabling colour management in the driver panel (Epson, Canon, HP, and others). Defaults to off — existing behaviour is unchanged unless explicitly enabled.
Clear Print Queue cancels every pending and stuck job for the selected printer without opening System Settings. When a new job is submitted, a pre-flight check detects held or aborted jobs and offers Clear & Print / Print Anyway / Cancel.
If the selected printer is unreachable (off, unplugged, missing from the network), ChromIQ shows an explicit error dialog before sending the job — no more "print-succeeded-to-nowhere" confusion.
The Measure tab wraps chartread and surfaces its full option set as checkboxes:
Disable bidirectional strip recognition (-B),
Suppress warning messages (-S),
Skip initial calibration (-N),
Patch-by-patch mode (-p),
High-resolution spectral (-H),
Patch consistency tolerance (-T, enabled at 0.7 by default),
and L*a*b* / XYZ output switches.
Spectral filter type (-F) lets you override the measurement condition used by the instrument: None (M0), D50 (M1), D65, UV Cut (M2), or Polarizing (M3). Disabled by default; D50 (M1) is pre-selected when you enable it — use M1 for ISO 13655-compliant measurements with OBA-containing papers.
The tab handles every runtime condition chartread raises: calibration prompts, wrong-strip warnings, unexpected colour-response warnings, "no instrument detected", strip-read retries, and a completion dialog when all strips are done. All measurement controls are locked while chartread is running.
In Guided mode, the Measurement Instrument section, Skip Initial Calibration, Patch-by-Patch Mode, and Additional Options are hidden — the panel stays focused on the essential strip-by-strip workflow. Manual mode also exposes refinement options: Refine existing measurement (-r) and a strip file picker, which activate guided strip-by-strip navigation when a strips file is loaded.
"Failed to get piif for USB device" error from ArgyllCMS and shows an "Instrument Not Accessible" dialog explaining how to disconnect the device from the VM and reconnect it to the host.
Exposes the full colprof option surface, organised into panels:
-r) and dark-region emphasis (-V).-s/-S checkbox pair. Defaults to Perceptual + Saturation against sRGB from the Argyll ref folder.Two controls appear in the Color Science section of both Guided and Manual modes (and in the Calibration tab's Build Profile module). Three additional controls are available in Manual mode only.
-Z m). Embeds the surface type in the ICC profile header so colour management systems can automatically select the correct profile when both matte and glossy profiles are installed for the same printer.-Z b). Marks the profile for monochrome inksets or pure-greyscale print modes.-Z t). For transparency inksets and slide-film workflows.-Z n). For photographic film negative workflows.-Z p/r/s/a). Marks which rendering intent the ICC profile header advertises as its default — used by CMSes that respect this field. Leave unset unless you have a specific reason.All selections default to ArgyllCMS defaults — no -Z flag is emitted unless you explicitly change a value. Settings are persisted via Save as Defaults (guided and manual) and user presets (manual).
Enable Enable calibration options in Preferences → Behaviour to unlock the full printcal → applycal printer calibration workflow. Off by default — most users profiling consumer inkjet printers do not need it. When enabled:
printcal to generate a .cal curve file. Supports per-channel target overrides for C/M/Y/K and extended channels (Ch4–Ch7), calibration metadata embedding, imitation target mode (-I), and a dry-run checkbox (-d). On success a dialog offers Go to Create Chart → with the .cal path pre-filled.applycal to bake, remove, or verify calibration curves on an ICC profile. A result dialog offers Install on this Mac.cal_ are automatically routed to Create Calibration File instead of Build Profile.
Wraps profcheck and adds a human-readable quality report on top. Two metrics drive the grade: average ΔE and peak ΔE. A profile with an excellent average but a handful of high-error outlier patches is graded accordingly — the report tells you which metric is limiting the grade.
When patches exceed your ΔE threshold, ChromIQ proposes re-measuring only those strips (the refinement flow). The "start over" recommendation fires only when more than 50% of individual patches exceed the threshold or more than 75% of strips are flagged — patch-based logic that avoids false alarms on small charts.
All preferences are stored via QSettings and survive updates and reinstalls.
Open with ChromIQ ▸ Preferences or ⌘+,. The following settings live here:
targen, printtarg, chartread, colprof, profcheck. Default: /Applications/Argyll/bin. Use Auto-detect to re-run detection, or Test binaries to confirm manually.~/ChromIQ/. Each session creates a subfolder named after the target — e.g. Canon_A4_Matte_i1_2026-04-18_14-30/..ti2 path in Measure, TIFFs in Print Chart and Measure, .ti3 and .icc paths in Build Profile, and both paths in Check & Refine. Missing or moved files are silently skipped.printcal → applycal calibration workflow. Tab 4 becomes "Calibration & Profiling" with three modules. See §4.4 for details.~/Library/Preferences/ChromIQ.ChromIQ.plistQSettings~/Library/Logs/ChromIQ/chromiq.log%LOCALAPPDATA%\ChromIQ\Logs\chromiq.logINFO level.~/Library/ColorSync/Profiles/%WINDIR%\System32\spool\drivers\color\ (may require administrator privileges)<Output folder>/<target-name>/ — chart TIFFs, .ti1/.ti2/.ti3, .icm profiles, quality reports.Every tab has a Save as Defaults button. Click it to persist the current combination of instrument, paper, flags, and advanced options as the starting point for the next session. Useful when you have a favourite workflow for a specific printer/paper pair.
The common failure modes and the fixes that actually work. When none of these help, check ~/Library/Logs/ChromIQ/chromiq.log — the exact Argyll command and its output are always in there.
That's macOS App Translocation. The app must run from a real location, not from inside a mounted disk image. Drag ChromIQ to /Applications, eject the DMG, then launch from Applications.
Open Preferences (⌘+,) and set ArgyllCMS bin path to the folder containing targen. The default is /Applications/Argyll/bin. Click Test binaries — if any are still missing, re-download ArgyllCMS 3.5.0 from argyllcms.com and confirm the bin/ folder was unpacked with its contents.
Click the ↺ icon next to the dropdown to re-query CUPS. If it's still missing, verify the printer appears in System Settings ▸ Printers & Scanners — ChromIQ only lists printers CUPS knows about. Network printers that have gone to sleep sometimes disappear; power-cycle and refresh.
Colour management is being applied twice. ChromIQ disables it at the CUPS level automatically, but some printer drivers re-apply a "Photo Enhance" or "Vivid Colour" pass on top. Look in your driver's advanced settings for anything that sounds like auto-correction and turn it off. Re-print from Tab 2 once it's disabled.
Plug the spectrophotometer directly into the Mac (not through a hub if you can avoid it), unplug any other colour-measurement device, then restart the measurement. On i1Pro-family devices, also check that the calibration tile is properly seated in the dock.
Fixed in an early release by disabling native file dialogs during measurement. Upgrade to the latest release from the GitHub Releases page if you are still seeing this.
Expected — that's exactly what Check & Refine is for. In Tab 5, click Run profcheck, then Guide Me Through Refinement. ChromIQ will walk you through re-measuring only the flagged strips, after which you rebuild from Tab 4. One or two passes usually pulls peak ΔE under 3.0.
If more than half of your individual patches are above threshold, yes — it's faster to reprint and re-measure than to chase that many outliers. The usual cause is wet ink (wait longer before measuring), wrong media type in the driver, or the measuring instrument being out of calibration. Re-calibrate, let the print sit 24 hours, try again.
Windows is supported as a public beta as of v3.0.0-beta.1. The full ArgyllCMS workflow (chart creation, measurement, profiling, quality check) runs on Windows. The main difference is printing: on Windows, ChromIQ opens the native Windows print dialog and you must disable ICM (colour management) in your printer driver manually before printing. See the Windows section in Chapter 2 for setup instructions.
Linux is not officially supported. ArgyllCMS runs on Linux and the printing layer uses CUPS, so it is theoretically possible from source — but untested and unsupported.
ArgyllCMS requires a WinUSB (or libusb0) driver to communicate with spectrophotometers on Windows — the native HID or vendor driver is not sufficient. Open Preferences → ArgyllCMS and click Install USB Driver…. ChromIQ scans the Windows registry for connected colorimeters and installs the WinUSB driver silently via UAC elevation. If that fails, click Try Zadig to open the bundled Zadig GUI for guided installation.
Supported device IDs include all X-Rite i1Pro family (VID 0765), ColorMunki, i1Studio, ColorChecker Studio, Datacolor Spyder, and Colorvision devices. Once the driver is installed, retry measurement.
This is resolved in v3.0.0-beta.7. ChromIQ now starts chartread with a real (hidden) Windows console so its interactive _getch() calls receive keystrokes correctly. Key presses are injected via AttachConsole + WriteConsoleInputW, identical to physical keyboard input. Upgrade to the latest Windows beta release if you're still seeing this.
Your spectrophotometer is currently assigned to a virtual machine (Parallels, VMware, VirtualBox, etc.) running on this host. Disconnect the device from the VM's USB settings, unplug and replug the instrument so the host reclaims it, then retry measurement in ChromIQ.
Open an issue on the ChromIQ GitHub repo. Attach the last 100 lines of ~/Library/Logs/ChromIQ/chromiq.log — the Argyll command line plus its full output is the single most useful thing in a bug report.
chartread prints in the log pane.