Safelight.

Paint what stays. Everything else becomes a one-pixel alpha checkerboard — invisible on X's white timeline, fully there once someone taps the photo.

Mask
Edge feather 2

One finger paints · two fingers pinch to zoom and pan

⌘/Ctrl + scroll to zoom · [ ] resize the brush · ⌘/Ctrl + Z to undo

100%
rendering
What people will see
1 · Timeline thumbnail on white — the hook
2 · Full size, white light-mode inline view
3 · Tapped the photo viewer's black backdrop
Settings
Hide strength
Brighten hidden 1.00×
Longest edge
Colour depth

Browsers write bulkier PNGs than dedicated encoders, and X rejects anything over 5 MB. Trimming colour depth is the cheapest way back under the line — the hidden half is dithered and then halved against black, so banding rarely survives to be seen.

Export
Dimensions
Kept solid
File size

How the trick works

The mechanism

Alpha is binary — every pixel is either fully there or fully gone. Your painted region stays solid. Everywhere else, every other pixel is punched out on the (x + y) % 2 === 0 lattice, so the photo is only half-present and takes 50% of its colour from whatever sits behind it.

X puts images on a white card inline but a black backdrop in the photo viewer. Same pixels, opposite ground: pale haze one moment, a real photo the next.

RGB under the transparent pixels is zeroed, which is what keeps the file small — identical bytes compress away.

Why the thumbnail goes blank

X pre-builds resized copies. The small and medium ones are resized with a smoothing filter and then flattened back to binary transparency — none of X's variants contain a single partial-alpha pixel. A 50% checkerboard averages to alpha ≈ 127.5, which lands just under the cutoff, so it isn't dimmed, it's deleted. Only fully-solid regions clear the bar. Measured on the tweet that started this:

VariantSizeTransparent
small414×67988.4%
medium731×120088.7%
large1248×204844.5%
orig1482×243244.5%

The timeline loads small; the viewer loads large, which keeps the pattern. That gap is the whole effect — preview 1 reproduces it with the same resize-then-threshold, matching the real variant to within 0.2%.

Because the cutoff is about the average alpha, not the pixel grid, it doesn't matter what dimensions you pick — as long as you stay above 1200, where medium stops being a downscale.

Posting it

  1. Paint over what should stay visible in the timeline — faces work because they read as objects floating on white.
  2. Check preview 2 — the full-size white view. That's the one people see inline before tapping; hide strength is what makes the background fainter there. (Preview 1 erases either way.)
  3. Check preview 3. If the reveal looks murky, nudge brighten hidden up — it pre-compensates for the light the checkerboard throws away.
  4. Download and attach the PNG directly. Don't run it through anything that re-encodes to JPEG; that discards alpha and the trick dies.

One caveat worth knowing: this is built for light mode. Anyone browsing X in dark mode has a near-black timeline already, so they see the full photo inline and never get the reveal.

PNG