Yesterday I wrote about Phocus quietly fixing a bug it never told anyone about. Hasselblad does the same thing with camera firmware, and twice now it has done it in your favor without a word in the release notes.
The first time was November 2025. Firmware 1.2.7.11 started recording a set of private fields in every 3FR, among them the data needed to work out exactly how far away you focused. The release notes mention none of it. The second time was July 16 this year, when firmware 1.3.16.1 began writing focus distance into the standard EXIF field that Lightroom Classic and Capture One both read. Also unmentioned. I tested that one in July and confirmed both editors use it, adjusting their lens corrections for the real focus distance instead of guessing.
Which leaves everything you shot before July in an awkward spot. Those files have no standard field, so both editors fall back on the assumption they have always made: that you focused at infinity. On a landscape at f/11 that costs you nothing. On a portrait at 0.6 m it is simply wrong, and the correction gets applied anyway.
But the data has been sitting in those files since November. So I wrote a tool that reads it and fills in the blank.
Fair warning before you read on: this is a command line tool. You point it at a folder by typing a line into Terminal, and there is no app to double click. The README walks through it assuming you have never opened Terminal before, and nothing you type can damage your originals, but if the prospect of a terminal window is a hard no then this one is not for you.
Key finding: hasselblad-focus-retrofit computes focus distance from private fields your camera has recorded since firmware 1.2.7.11, corrects it per lens, and writes it into the standard EXIF field Lightroom and Capture One read. It works on copies, so your originals are never opened for writing. Free, MIT licensed, Python 3.
What the difference actually looks like
Both of these come from one RAW file, shot on an X2D II with the XCD 55V at about 0.64 m, on firmware 1.2.7.16. Nothing was changed in Lightroom between them, and the image data is byte for byte identical. The only thing that differs is whether the file carries a focus distance.
I expected a subtle difference when I first ran this test. It is not subtle.
Why can't your editor see focus distance in older files?
Since firmware 1.2.7.11 (November 27, 2025), every 3FR carries three private fields from the IBIS system: an effective focal length adjusted for focus breathing, a magnification ratio, and a nodal plane distance. They are undocumented, they sit in the maker note rather than standard EXIF, and ExifTool has no Hasselblad module that names them. No editor reads them, which is what I established in the July post.
But two of them are enough. Focal length and magnification give you subject distance through the thin lens relation, d = f(1 + 1/m). It is first-year optics, and the camera hands you both inputs directly.
So the tool reads those two numbers, does the arithmetic, and writes the answer into EXIF tag 0x9206, which is the tag your camera started writing on its own in July and the tag both editors already know how to use. The editors cannot tell the difference between a distance your camera wrote and one the tool wrote. I confirmed that the hard way in July, by hand-editing that field in a test file and watching Lightroom and Capture One both change their output.
The formula is close, not exact, which is why calibration exists
The thin lens relation assumes an ideal lens. Real XCD glass has floating elements, and the deviation grows as you focus closer. Here is the error on the XCD 55V, measured across a nine-frame ladder by comparing the formula's answer against the distance the camera itself reported on current firmware:
The thin lens estimate compared against the distance the camera itself records, across a nine frame ladder at the focus distances marked below. Bars below the line mean the formula reads short, above it reads long.
Under 1% past two meters, roughly 15% at close focus. The error is smooth and systematic, not noise, which means it can be measured once per lens and corrected. That is what the calibration files do.
The correction is also per lens in a way that matters. The 55V formula reads low at close focus; a measured XCD 90V frame reads high, +9% at 0.5 m, the opposite direction. No single fudge factor fixes both.
Version 0.1.0 ships calibration for five lenses: the XCD 25V, 55V, 90V, 120 and 135. If you use something else the tool still processes your files, still writes a real distance, and marks the result UNCALIBRATED in its report so you know the number carries the error above rather than being corrected for it. Even uncorrected it beats the alternative, because the alternative is your editor assuming infinity.
Calibrating a lens yourself takes about ten minutes: update your camera to current firmware, shoot six to eight frames stepping from minimum focus out to roughly three meters, and point the tool's calibrate command at the folder. Sharpness does not matter, since only the recorded numbers are used. If you do that, the repository takes submissions.
Have you seen the guide? I've published Essential Phocus 4.x for Mac - 85 topics across 8 sections and 246 pages covering everything from HNCS color science to HDR workflows. It's the reference manual Hasselblad hasn't updated since 3.8. It's $49, and updates are included.
What does it do to your files?
Running it with no flags is a dry run. It reports what it would write, per file, and touches nothing:
python3 hb-focus-retrofit.py retrofit --source ~/Desktop/X2D-ImportAdding --apply writes corrected copies into a new folder, leaving your originals where they are. Nothing is edited in place, so there is no version of this where a bad run damages an archive. Each copy is verified after writing and deleted if it fails, and re-running skips work already done.
Files that cannot benefit are skipped with a reason printed: anything shot before November 2025 has no data to work from, anything focused at infinity has nothing meaningful to record, and anything already carrying a distance is left alone. The tool never guesses.
What it will not do
It has been verified on the X2D II 100C only. It checks for the data rather than the camera model, so other bodies may work, and I would like to hear about it either way.
FFF files are not supported yet. The format is close enough that it should be workable, but I have not tested it, so it refuses rather than pretending.
The two E zooms, the 20-35E and the 35-100E, get the uncorrected formula and nothing better. Calibration in version 0.1.0 is a single curve per lens, keyed on magnification, and that only holds when focal length is fixed. On a zoom the same magnification at 20 mm and at 35 mm are different optical situations that want different corrections, so one curve cannot describe both. Shooting a ladder at one focal length and submitting it would produce a calibration that is right at that setting and wrong everywhere else, which is worse than none. The zooms still get a real distance from the formula, marked UNCALIBRATED, and a proper fix means a calibration surface across focal length rather than a curve. That is a later version.
Teleconverters are the other case that needs a warning rather than a shrug, and it is the same problem wearing a different hat. Frames shot with the X Converter 1.7 carry exactly the same lens name as bare frames, and nothing in the file distinguishes them, so a converter frame would receive the bare lens calibration and come out wrong. Keep those out.
That last point produced the odd finding of the week. On a 135 ladder shot with the 1.7x attached, the camera's own reported focus distance froze at 1.66 m for five consecutive frames while the private magnification field showed the lens focusing steadily further out, then jumped straight to three meters. The bare lens sequence shot minutes earlier stepped through the same range cleanly. With a converter mounted, the camera's standard distance tag stops tracking somewhere between roughly 1.7 and 3 meters, while its private fields keep working right through the gap.
Getting it
The repository is at github.com/kmichels/hasselblad-focus-retrofit, and v0.1.0 is tagged there. It is a single readable Python file with no dependencies beyond Python 3 itself, which is deliberate: you should be able to read what a tool does before you point it at your archive. The README is written for people who have never opened a terminal, and there is an EVIDENCE file documenting every verification behind the claims in this post.
If you shoot a lens outside the five it ships with, the calibrate command and a ten minute ladder will add it, and the repository takes submissions. The 38V, the P lenses and every original-series prime are still blank. The zooms will have to wait for me to work out the harder version.
References
- Hasselblad X2D II RAWs Record Focus Distance. Now Your Editor Reads It - the original investigation, including the tests showing Lightroom Classic and Capture One both use the standard field
- hasselblad-focus-retrofit on GitHub - source, README, and calibration data
- v0.1.0 release - release notes and download checksum