How the glow works
Three things have to be true at once: the pixels must state their brightness in absolute units, the file must say which units those are, and the carrier must survive LinkedIn's re-encode. Miss any one and you get a grey logo.
Absolute versus relative brightness
In sRGB, a pixel value of 255 means “as bright as this display calls white” — a relative instruction. The PQ transfer function from SMPTE ST 2084 works differently: code values map to absolute luminance in nits, up to 10,000. A pixel can therefore ask for 3,000 nits, and an HDR display that has the headroom will give it, while the page around it stays at the couple of hundred nits that normal white occupies.
We put diffuse white at 203 nits, the BT.2408 graphics-white reference, and lift the parts you want glowing above it. That anchoring matters: it's why untouched areas of your logo look normal instead of blown out.
Why the obvious export fails
Photoshop and Camera Raw produce gain-map HDR: a standard image plus a hidden greyscale map describing how much to boost each region, tied together by XMP metadata and stored using the Multi-Picture Format. It looks perfect locally. Then LinkedIn re-encodes the upload, drops the MPF segments and the XMP packet, and the boost instructions vanish with them. The pixels left behind are the ordinary SDR ones.
What LinkedIn does preserve is colour management. So the brightness has to be smuggled inside the ICC profile, which is the one thing that makes it through intact.
The part that took two tries
An ICC profile with a PQ tone curve is not enough on its own. A colour manager that doesn't recognise the curve as PQ simply applies it, reads about 0.3 for a 3,000-nit white, and paints mid-grey — the image comes out dimmerthan the original. The W3C's HDR-for-the-web report describes exactly this failure for PQ signalled through ICC alone.
The fix is the CICP tag, added to ICC in version 4.4. It carries four bytes of code points borrowed from video signalling — 9 for BT.2020 primaries, 16 for ST 2084, 0 for RGB, 1 for full range — and browsers use it to recognise the profile as HDR rather than as a curious tone curve. Skia's colour library parses it and marks the image accordingly.
Checked against a real one
We pulled a glowing logo off LinkedIn and took it apart. It's a progressive, 4:4:4, 8-bit JPEG with a JFIF header and exactly one ICC profile: Apple-generated, version 4.4, described as “Rec2020 Gamut with PQ Transfer”, carrying CICP 9/16/0/1. No gain map. No XMP.
Its mark decodes to 3,085 nits — about +3.9 stops over diffuse white, at code value 223 — and the boost is a flat lift across every pixel rather than a masked one, which works because the background is pure black and black times any gain is still black. Our encoder at the same setting produces the same code value.
What this tool does with that
- Composite your artwork onto an opaque background, since JPEG has no alpha channel.
- Decode sRGB to linear light, apply the boost — flat, or weighted toward highlights.
- Convert linear BT.709 to linear BT.2020.
- Scale to absolute nits against the 203-nit anchor and encode with the PQ curve, with ordered dithering to suppress 8-bit contouring.
- Write a JPEG at full quality so chroma stays 4:4:4, strip every APP1 and APP2 segment, and insert one ICC profile built to match the reference.