A native macOS GUI for the monitor side of ArgyllCMS, built with SwiftUI and AppKit. Designed around an X-Rite i1Pro3 Plus, with Argyll’s own device discovery and full argument access for other supported instruments.
Requires macOS 14 or later, Swift 6 / Xcode command-line tools, and an existing ArgyllCMS installation. No third-party Swift packages or network downloads are needed.
git clone https://github.com/dhucul/ArgyllStudio.git
cd ArgyllStudio
bash scripts/build.sh
bash scripts/run.shThe build creates dist/Argyll Studio.app, signed locally with an ad-hoc signature. Open it from Finder or with scripts/run.sh. This is a local development build, not a notarized distribution. The package can also be opened in Xcode via Package.swift.
Settings detects ArgyllCMS in /opt/homebrew/bin, /usr/local/bin, or PATH. Select a different bin folder if necessary. The installation on the development computer was ArgyllCMS 3.5.0.
Build the native .pkg installer with:
bash scripts/build-installer.shThis rebuilds the app and creates installer/ArgyllStudio-1.3.7-arm64.pkg on Apple Silicon (the filename uses the app version and actual executable architecture). Open the package to install Argyll Studio.app in /Applications. The installer requires macOS 14 or later and the architecture included in the package. It asks you to close Argyll Studio before updating it and does not relocate a source build from your GitHub folder.
The installer checks for an existing, complete ArgyllCMS monitor installation before allowing installation. It recognises Homebrew at /opt/homebrew/bin, /usr/local/bin, /opt/homebrew/opt/argyll-cms/bin, and /usr/local/opt/argyll-cms/bin. All six required tools must be in the same folder: dispcal, dispread, dispwin, spotread, targen, and colprof. A preinstall script checks that the files are executable immediately before copying the app. It follows Homebrew symlinks, rejects broken links and incomplete installations, and does not run Homebrew or its tools as root.
If the tools are missing, the installer explains how to install them using brew install argyll-cms, then reopen the package. It uses your existing Homebrew installation directly. It does not download, install, or modify ArgyllCMS, change monitor calibration, or install a monitor profile.
The app checks the same standard folders on launch, including Homebrew's opt paths, and falls back to another complete installation when a saved path no longer works. Custom installations outside these standard folders can still be selected in the app's Settings; the .pkg prerequisite check expects one of the standard locations.
The package is a local development installer without a Developer ID Installer signature or Apple notarization. The bundled app has a local ad-hoc signature. Installer resources, the dependency rules, and preinstall source are in installer/; generation and packaging scripts are in scripts/.
Test the installer checks without installing anything:
python3 installer/tests/test_installer.pyNode.js is used only to test Installer's JavaScript; end users do not need Python or Node to run the package.
- Connect the i1Pro3 Plus by USB and Refresh devices.
- Open White point. Native display · -R is the default method and runs
dispcal -R -v, with your selected monitor and instrument. Current calibration · -r runsdispcal -r -vinstead. Both use Argyll's own monitor patches, report, and exit; they do not create an ICC profile. - Choose Measure display. If requested, place the instrument on the reflective white reference whose serial number matches the prompt, then press any key in the console or click Continue (Space). Move the instrument onto Argyll's test window when instructed.
- White brightness in cd/m², x/y chromaticity, and classic CCT appear in the result cards. Black level, gamma, contrast, daylight temperatures, and the rest of the monitor report remain in the output. Repeat Measure display for another report.
-R requests native response with current calibration bypassed; -r measures with current calibration applied. If Argyll cannot bypass the video calibration, the app explicitly labels the available as-is response rather than claiming confirmed native measurements.
Spot measurement remains an explicit alternative using spotread -v -e -x -T, with an optional static dispwin white patch. It is not the default white-point report. Modes or formats that change absolute emissive Yxy readings stay in the console rather than being mislabeled as cd/m². The optional spot patch closes with its session; unexpected patch failure stops measurement.
dispwin -r -v tests video-LUT loading and beeps; it does not measure white point. Uppercase dispwin -R is not an option in the installed ArgyllCMS 3.5.0. Flags are case sensitive and tool specific.
Up to 100 absolute readings are retained, with the measurement method recorded. Export them to CSV; current-session readings are also saved as readings.json. Clear output clears the visible console while preserving readings, command state, and the full session log. Export log exports that complete log, including cleared text.
Use Options guide in the app toolbar for the offline reference. The same Controls and commands document lists every guided control's flag and scope, all measurement methods, profile actions, and keyboard controls.
The Calibration screen offers D65/D50/D55/native white point, custom temperature, native or numeric luminance, gamma 2.2/2.4, sRGB, L*, Rec.709, BT.1886, quality, observer, drift compensation, patch size, video levels, black background, instrument mode, high-resolution spectra, and optional colorimeter corrections.
Version 1.2 adds Apple CMF 2026 and Custom CMF import slots. Actual Apple CMF 2026 data is not bundled: measurements with that choice stay disabled until the user imports genuine X/Y/Z observer curves obtained from Apple or a vendor. The import accepts Argyll .cmf files or uniformly sampled wavelength/X/Y/Z CSV, preserves scaling, and passes the resulting file through -Q. Readings and CSV exports retain observer identity and data hashes. See the complete observer setup instructions for data requirements and Studio Display XDR preset matching. Import format validation does not authenticate the source, and Apple CMF 2026 measurement accuracy has not been verified without genuine data.
Version 1.3 adds a Corrections section for creating CCSS/CCMX files with ccxxmake, interactively or from existing .ti3 measurements. CCSS needs your reference spectrometer; CCMX also needs the target colorimeter. A file reader displays metadata, CCMX matrices, CCSS spectral summaries and the full file text. Created files are validated and opened after completion; applying one through -X is an explicit action. The console supplies guarded 1–4 menu buttons and retains ordinary key input at calibration prompts. The creation feature requires ccxxmake in the selected engine folder. Complete options and workflows are in the bundled guide.
Version 1.3.1 fixes custom observer conversion in Argyll 3.5.0, accepts XYZ-only CCMX references with the standard observer, and adds a refresh-mode setting for existing files with missing metadata. Numerical integration tests check all three cases with synthetic data when ccxxmake and spec2cie are installed; these tests do not use instruments.
Version 1.3.2 guides CCMX creation explicitly: i1Pro3 Plus reference readings first → i1Display Pro colorimeter readings second → Save correction → Finish / Exit. The guide stays visible beside the console, shows completed readings and the selected meter, and explains why Save is unavailable until both sets exist. Instrument-selection prompts offer meter-name buttons. CCSS has its own one-meter instructions. Saving a correction is separate from creating an ICC monitor profile in Calibration; select the corrected colorimeter when using the CCMX there.
Version 1.3.3 fixes completion tracking when menu choices are entered with Return or Send line, including clearing the saved status when patches are measured again. Changing the correction type or source clears the previous session's completion marks while retaining the inspected file and active correction.
Version 1.3.4 puts Last saved correction at the top of Corrections with the full file path, Show in Finder, Copy path, Save a copy…, and Use this correction. Saving immediately shows the location beside the live controls; finishing returns to the result and keeps its location visible in the console. The last saved location survives relaunches, including corrections created by earlier versions. Save a copy… lets you choose a more convenient folder and retains the original measurement-session file.
Version 1.3.5 restores the location and file actions immediately when a recovered correction replaces a missing saved file, without needing an app restart. Copy destinations are appended to the c 8346 ompleted session's on-disk log, so Export log and Clear output preserve that history too.
Version 1.3.6 keeps the console in its normal chronological order and follows the latest output after text layout, prompt focus and window resizing settle. Re-enabling Follow output immediately jumps to the latest text, and new prompts return to the left edge after long output lines. Turn Follow output off to read earlier output without being moved.
An i1Pro3 Plus is a spectrometer; normally leave colorimeter corrections empty. Argyll handles instrument reference calibration and requests it when needed. The app does not silently skip this step.
Three workflows are available:
| Workflow | Commands | Output |
|---|---|---|
| Quick profile | dispcal -o monitor.icc |
Calibration and matrix/shaper ICC profile |
| Detailed profile | dispcal → targen -d3 → dispread -k monitor.cal → colprof |
Calibration, RGB target, measurements, and ICC profile |
| Calibration only | dispcal |
Calibration curves |
The detailed workflow supports patch count and profile algorithm selection. It measures with the calibration loaded by -k, allowing Argyll to carry calibration information into the profile. The pipeline stops on a failed command or missing expected output. A new timestamped folder prevents guided sessions from overwriting previous results.
Warm up the display and disable Night Shift, True Tone, HDR, automatic brightness, and other changing display adjustments when doing an SDR calibration. Capability to load video LUTs depends on macOS, the display, and the GPU; Argyll’s reported errors and warnings are shown verbatim. This app does not claim HDR calibration or direct programming of a monitor’s internal hardware LUT.
The library finds ICC/ICM files in the output folder. You can open an existing profile from elsewhere, reveal it in Finder, install it for the selected monitor/current macOS user (dispwin -Su -I), load its calibration curves, or verify that those curves are loaded (dispwin -V). Externally opened profiles remain in the library after actions, refreshes, and app relaunches; their original files are not copied or moved. Installation only happens when you choose Install.
Verification explicitly reports a match or a failure. A dispwin -V mismatch is treated as a failed verification even when Argyll exits with status zero; a missing verification result also fails. Argyll warnings that calibration could not be loaded or installed because video-LUT access is unavailable are reported as failures. Verification of video calibration curves is not a colour-accuracy/Delta E verification. Use profcheck, measurement targets, and other commands in Command lab for the accuracy workflow you require.
Command lab exposes the executable, an unrestricted argument field, a working directory, the installed version’s -? help, and a link to official documentation. Every argument supported by the chosen tool can be passed, in the same order as on the command line. Guided calibration additionally has separate extra-argument fields for dispcal, targen, dispread, and colprof. These add options without named controls; managed flags are rejected so they cannot silently contradict a visible control. Command lab remains unrestricted.
Included tools: dispcal, dispread, dispwin, spotread, targen, colprof, ccxxmake, applycal, iccvcgt, collink, profcheck, invprofcheck, colverify, iccdump, iccgamut, viewgam, icclu, xicclu, extracticc, extractttag, synthcal, spec2cie, specplot, and oeminst.
There are no printing workflows. Some general tools support printing-related flags in their own command-line interface; the argument field does not filter a tool’s capabilities.
Arguments are parsed with single/double quotes and backslash escapes, then passed directly as argv. There is no shell evaluation: ~, $variables, glob patterns, pipes, redirects, and semicolons are literal arguments. Use absolute paths or paths relative to the working folder. Argyll options that explicitly invoke external commands, such as -C or -M, retain Argyll’s own behaviour.
For example:
Tool: dispcal
Arguments: -v -r -d1 -c1
Tool: iccdump
Arguments: -v 2 "/absolute/path/to/my monitor.icc"
Single-key prompts are supported through a real pseudo-terminal with a controlling /dev/tty. The output area accepts physical keyboard input and takes focus at command startup. While Argyll waits for a key, keys outside editable text fields also work. The console offers Continue (Space), Return, Esc, exact Send keys, newline-terminated Send line, and Ctrl+C/Ctrl+D/Tab through the keyboard menu. Command+C keeps its normal Copy behaviour. Stop terminates the process group and cancels remaining steps, escalating to SIGKILL if needed.
Guided session outputs default to ~/Documents/ArgyllStudio (configurable). Settings and recent white readings use macOS UserDefaults for local.argyllstudio.app. Guided sessions retain their settings, exact command plan, measurement files, and a uniquely named complete log. Command lab writes a uniquely named log to its working folder. The live console is bounded to keep the UI responsive; the on-disk log retains the full output.
Calibration can change the loaded video curves while it runs, including if it is interrupted. Profiles → Reload installed calibration restores the curves from the currently installed profile. The app does not automatically install profiles or silently restore curves after a measurement.
bash scripts/test.shThe tests cover argument quoting, generated command plans, native targets, BT.1886, device discovery, white-point output parsing, a real controlling terminal, single-key input, cancellation, and generating an RGB target with the installed targen. Workflow regression tests use mock executables and memory-only preferences (no test .plist files are written to ~/Library/Preferences) to check incompatible measurement modes, white-patch failure and cleanup, manual patch startup, zero-exit verification mismatches, and retention of imported profiles across actions and relaunches. They do not start a monitor calibration, take physical instrument readings, or install a profile. End-to-end measurement accuracy still requires a connected instrument and a real measurement session.
Sources/ArgyllCore: argument parsing, command plans, discovery, measurement parsing, and terminal runner.Sources/CArgyllPTY: small macOSforkpty/execvbridge.Sources/ArgyllStudio: native interface and workflow orchestration.Tests/ArgyllCoreTests: core and process integration tests.Tests/StudioModelTests: GUI workflow regression tests with mock instruments and isolated preferences.scripts: local build, launch, test, and programmatic icon generation.
ArgyllCMS is separate software by Graeme W. Gill, licensed under AGPLv3. No ArgyllCMS source or executable is copied into this project. This project is an independent frontend and is not affiliated with X-Rite or ArgyllCMS.
Official references: dispcal, dispread, spotread, dispwin, instrument operation.