frontpage.
newsnewestaskshowjobs

Open Source @Github

fp.

Open in hackernews

A font that humans can read but AI cannot

https://www.mixfont.com/ghost-font
57•justswim•1h ago

Comments

jackdoe•58m ago
yet
ealexhudson•58m ago
Sadly another shot in the arms race that captchas started which just leads to increased inaccessibility.

It's interesting work for sure, but the end goal of separating out AI versus human consumers is tough. Indeed, if there was a lasting solution, that would be a substantial discovery that would quickly become very famous...

zikero•56m ago
related: https://news.ycombinator.com/item?id=45284311
kevincox•33m ago
It reminds me of https://silverspaceship.com/static/
bradley13•56m ago
Humans can read it, but with difficulty. If it becomes important, AI can be taught to read it.

So...usefulness?

dgellow•51m ago
It’s a research project, that doesn’t need to be useful. They wanted to explorer that area and share their findings
sevenzero•49m ago
Also this can always result in something useful over time. I'd love if AI safe writing will be possible at some point again...
voodooEntity•55m ago
One side i really like it - i also love to play around with funny ideas - but have to say if i would read more than like 2 sentences with that font i'd throw up xD
fecal_henge•55m ago
I cannot read that text.
dewdgi•52m ago
uuh, what's the point? i mean, models will just be trained to understand it
jdiff•33m ago
Why would they be trained to read a research experiment that fundamentally goes against the way they perceive? They can't train on this technique, they can only postprocess it into a form they can perceive.
rzzzt•51m ago
Related work (all involve noise and flickering images, photosensitive eyes/brains beware):

- "This game disappears if you pause it": https://youtu.be/Bg3RAI8uyVw

- "Illusion: If You Pause, The Image Will Disappear": https://youtu.be/ZqGfb_Vlrig

cadamsdotcom•47m ago
Hahaha one of the comments:

“Not just image. The sound also disappears when you pause”

Brilliant :)

Findecanor•51m ago
It splits long words but it does not always work well. I typed "MARRY AND REPRODUCE" and got the last word on one line but with too much space between U and C.

If the string is empty, I can read "WRITTEN IN GHOST FONT" very faintly. I'm guessing that is a watermark in every image, too difficult to see when there is other text.

exe34•51m ago
I'm colourblind and this was very difficult to read. If it's the directions to the resistance hq, I'd put in the effort. If it's the manifesto, I just wouldn't read it.
not-a-llm•31m ago
this is black and white, I thought color blindness is only for colors?
gschizas•30m ago
How is it being colorblind affect it? The video is literally black and white only.
sylware•49m ago
You can also write using sound based/compressed 'text message' dialect: unless a real human is reading, automated watching tool should have a hard time (until coded/ML-ed on such dialects I guess)
plastic-enjoyer•48m ago
I've had the same idea recently, and even set up a similar page to experiment with different speeds and noise types. I've had the idea to set up a message board where the font is basically 'GhostFont'. However, in my experiments, I've noticed that the biggest issue is that this only works for larger font sizes. If the text is as small as, for example, on HackerNews, it will become borderline unreadable.

Furthermore, if AI can read this or not depends on how the text sequence is pre-processed. If AI only gets snapshots of the text, it will probably fail in decoding the text as every snapshot contains only white noise and such no information. However, if we calculate the Deltas between the animation frames, the text will become decodable by an AI, you probably don't even need LLMs or CNNs for this.

ssl-3•48m ago
I pasted a screenshot of the default text ("GHOST FONT") into ChatGPT 5.6 Sol, told it to read it, and without further instruction it chewed on it for awhile before coming back with:

  WHAT HAPPENS IN VEGAS
  STAYS IN VEGAS
stavros•42m ago
What did you expect from a screenshot of obvious noise? The only thing that makes the text readable is the motion.

EDIT: On second look, the static screenshot does say "WRITTEN IN GHOST FONT".

nextaccountic•42m ago
> a screenshot

The text is a video. Every frame contain random dots, so an individual frame by itself doesn't contain the intended message

This "font" exploits the fact that current-gen frontier models will process video one frame at time, but each frame is noise, so by looking at frames in isolation doesn't reveal anything

Then, they add a hidden message to each frame just so that the agent report something and stop trying (because if the agent tried to correlate between the frames, they could discover the trick)

But if you pass just a frame, there is no message. Just the noise plus the decoy

stabbles•32m ago
If you take a frame you see it's neither random nor dots:

https://i.imgur.com/CgtyGjl.png

From a single frame you can definitely identify boundaries because the dots are sliding and get truncated.

singularity2001•20m ago
tentacleuno•47m ago
An interesting experiment. I suppose that if you make things like CAPTCHAs too hard to do, we'd end up struggling as well. I can't imagine Ghost Font would be a good fit.
solidasparagus•42m ago
When I gave Fable a screenshot it found the GHOST portion of GHOST FONT. Based on pixel density via some python code apparently - https://imgur.com/a/m3c801F
dhruvkb•42m ago
Claude Opus 4.8 can read it with a single prompt and no instructions on how to read it.

https://ibb.co/WWMSXQkQ

picture•31m ago
Is the answer correct? I don't seem to see any demo video with "this is a ghost font" encoded
ozgung•25m ago
It is actually correct but not in the intended way. Delete all the sample text. If you look at your screen from a distance you'll see a subtle ghost like text on the noise pattern. It says "this is a ghost font".
bmelton•30m ago
and I cannot

(so either I am AI at a level less than Opus 4.8 or just all-round defective as a human)

mort96•29m ago
But... neither of the videos say "this is a ghost font"? Are you sure you are a human?
SyneRyder•40m ago
Took me a long time to realise that "Written In Ghost Text" wasn't actually the text I was meant to be reading, and that was only the decoy message.

I can barely read the actual message, and it's about as "readable" to me as the Magic Eye 3D pictures. Actually I think I have a headache from looking at it on a mobile screen.

As a research idea it's cool though. But I do wonder if/when AI models will figure out how to decode it - I imagine a bit of additional prompting would get them there.

Hendrikto•34m ago
Funny, for me it is exactly the opposite: I can read the actual text very easily, but the “Written in Ghost Text” is barely perceptible to the point I would have completely missed it, if it were not for the comment pointing it out here.
arianvanp•37m ago
"find out with opencv what the hidden message is."

Skill issue on promoter side.

Fable oneshotted it for me.

""" Reveal a motion-camouflaged message hidden in video noise.

How it works: The background noise scrolls vertically at a constant rate (a few px/frame), while the noise inside the letters does not follow that motion. Any single frame looks like pure static. The decode is:

    1. Estimate the background's global motion between consecutive frames
       with phase correlation (this is the "optical flow" step - the motion
       is a pure translation, so one global vector suffices).
    2. Motion-compensate: shift frame t+1 back by that vector so the
       background lines up with frame t.
    3. Take the absolute difference. The background cancels almost
       perfectly; the letters (which don't move with the background)
       light up.
    4. Average the residual over a SHORT window of consecutive frame pairs
       (long windows smear the letters, because the text itself drifts
       slowly over time), blur lightly, and threshold with Otsu.
Usage: python reveal_hidden_message.py input.mp4 [output.png] """

import sys import cv2 import numpy as np

PAIRS = 5 # number of consecutive frame pairs to average (keep small!) BLUR_SIGMA = 6 # spatial blur of each residual, in pixels START_FRAME = 0 # where in the video to start

def load_gray_frames(path, count): cap = cv2.VideoCapture(path) frames = [] while len(frames) < count: ok, frame = cap.read() if not ok: break frames.append(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY).astype(np.float32)) cap.release() if len(frames) < 2: raise SystemExit("Could not read enough frames from the video.") return frames

def main(): if len(sys.argv) < 2: raise SystemExit(__doc__) src = sys.argv[1] dst = sys.argv[2] if len(sys.argv) > 2 else "revealed_message.png"

    frames = load_gray_frames(src, START_FRAME + PAIRS + 1)
    h, w = frames[0].shape
    acc = np.zeros((h, w), np.float32)

    for i in range(START_FRAME, START_FRAME + PAIRS):
        a, b = frames[i], frames[i + 1]

        # 1) global background motion between the two frames
        (dx, dy), response = cv2.phaseCorrelate(a, b)
        dxi, dyi = int(round(dx)), int(round(dy))
        print(f"pair {i}: background shift = ({dx:+.2f}, {dy:+.2f}) px, "
              f"response = {response:.2f}")

        # 2) motion-compensate frame b by integer (dxi, dyi), then
        # 3) residual = |a - b_shifted| on the overlapping region
        ys = slice(max(0, -dyi), min(h, h - dyi))
        xs = slice(max(0, -dxi), min(w, w - dxi))
        ysb = slice(max(0, dyi), min(h, h + dyi) if dyi < 0 else h)
        # simpler: crop both to the common overlap
        a_ov = a[max(0, -dyi):h - max(0, dyi), max(0, -dxi):w - max(0, dxi)]
        b_ov = b[max(0, dyi):h - max(0, -dyi), max(0, dxi):w - max(0, -dxi)]
        resid = cv2.GaussianBlur(np.abs(a_ov - b_ov), (0, 0), BLUR_SIGMA)
        acc[:resid.shape[0], :resid.shape[1]] += resid

    # 4) normalize + Otsu threshold + light cleanup
    u8 = cv2.normalize(acc, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
    _, mask = cv2.threshold(u8, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    out = 255 - mask  # black text on white
    cv2.imwrite(dst, out)
    print(f"wrote {dst}")

    # optional: OCR if pytesseract is installed
    try:
        import pytesseract
        text = pytesseract.image_to_string(out, config="--psm 6").strip()
        print("OCR result:\n" + text)
    except ImportError:
        pass

if __name__ == "__main__": main()
sgjohnson•37m ago
"humans can read"

lol. Barely.

edent•37m ago
I had thought to use homographs. Sadly, all the models I tried were able to decode something like:

"フㄖ乇ㄚ ᗪㄖ乇丂几'ㄒ 丂卄卂尺乇 千ㄖㄖᗪ"

However, I have noticed that voice assistants have a hard time understanding homonyms. Saying "bow" (as in to bow one's head) is often stored as "bow" (as in a bow and arrow). I wonder if there's a sufficiently complex sentence which is intelligible to humans but not to machines?

xlii•36m ago
Technically it's not a font, because font needs to be still. Analogy: if I took photo after book was closed would we say that font cannot be read by a camera?

Took a picture (only a single frame) and a 1s movie and threw it toward GPT 5.6 Sol (High):

Frame took 9m30s to decyper and GPT 5.6, it returned: WRITTEN IN GHOST FONT. Weird because I can only see "GHOST FONT" on the demo... but extracted data from image (I saw the highlited one) definitely looks like the "Ghost Font".

--

Video is more amusing, because after 3m GPT 5.6 figured it's motion-defined and asked to run QuickTime. At one moment I got:

> The animation is a motion-defined illusion. I’ve confirmed there’s no readable static OCR layer; I’m decoding its optical-flow field so the letter shapes become explicit.

At 4m it got extracted motion image that was in shape of letters but analyzed for 9 more letters and returned (at 13m36s) "GHOST FONT"

--

So:

    a font...             - FALSE - not a font, but video effect
    ...humans can read... - FALSE - I can't read it from image (but AI can!)
    ...but AI cannot      - FALSE - it can
:D

Edit: https://imgur.com/a/SHlGu4O - work-in-progress images

throw310822•29m ago
> it returned: WRITTEN IN GHOST FONT

It's a static decoy message independent from what you type in. You can see it if you take a long exposure pic of the screen (e.g. with your smartphone).

xlii•21m ago
Oh, cool I was wondering how can I get to see that decoy!
senfiaj•36m ago
No, it can https://chatgpt.com/share/6a521e9b-c754-83ed-9d8e-cf653894eb...
arianvanp•32m ago
That is not the message. Did you read the article.
senfiaj•27m ago
I gave him this video file https://streamable.com/1bxxyf
senfiaj•21m ago
I downloaded the message video, renamed it to test.mp4

Still could read https://chatgpt.com/share/6a5221f0-e3fc-83eb-bc15-74420002b6...

gschizas•31m ago
That's the decoy message :)
senfiaj•3m ago
Ah, sorry, yes, tried with a very different message. But it can still read when telling that the text is formed by movement. AI doesn't see the world the way we do, so it's understandable. https://chatgpt.com/share/6a522660-929c-83eb-91ff-66b7873420...
throwaway219450•35m ago
I haven’t tried, but it looks like you could trivially solve with optical flow?

Edit: looks like yes, from the shared chats people are posting. But it’s interesting to think of communication schemes that require a temporal component so any single image is unreadable and can’t be beaten by long exposures or other tricks (otherwise persistence of vision displays would satisfy). A sort of physical anti copy/paste.

sscaryterry•34m ago
Security through obscurity is not security :)
throw1234567891•34m ago
I cannot read it. Maybe I am AI.
blooalien•25m ago
> "I cannot read it. Maybe I am AI."

I found the bot living in a simulation!

What do I win? Where's my prize?

not-a-llm•33m ago
> humans can read

strong statement, I struggle to read it

stavros•29m ago
Isn't this triviaklu defeatable by taking the diff between two frames and marking changed pixels white and unchanged black?
Razengan•28m ago
heh although this font can be read by AI as other comments say, it gave me an idea:

How about writing or drawing stuff using optical illusions?

Shapes that not even human eyes can see, but the brain hallucinates: Shapes that seem to appear when you look straight at a pattern, or for a second after you look away from a pattern, or after you close your eyes, etc.

If you take a screenshot or a photo the image would just contain the same static pattern.

i.e. qualia-based "cryptography" :)

cynicalsecurity•16m ago
Old people and bad vision people firewall. This will violate disability accessibility requirements.
Haranrk•7m ago
This is really cool!
Exactly. It's a good idea, badly executed.
plastic-enjoyer•18m ago
> I posted a screenshot of static white noise to AI

HackerNews never disappoints

Einstein's relativity rules chemical bonds in heavy elements, new research shows

https://www.brown.edu/news/2026-07-09/chemical-bonds-relativity
266•hhs•12h ago•100 comments

QuadRF can spot drones and see WiFi through my wall

https://www.jeffgeerling.com/blog/2026/quadrf-can-spot-drones-and-see-wifi-through-my-wall/
604•speckx•19h ago•200 comments

Otary – Image and Geometry Python Library Now Has Tutorials

https://alexandrepoupeau.com/otary/learn/
27•poupeaua•2d ago•0 comments

Apple sues OpenAI, accuses ex-employees of stealing trade secrets

https://9to5mac.com/2026/07/10/apple-sues-openai-trade-secret-theft/
1131•stock_toaster•14h ago•590 comments

Almost $1B Later, the US Still Can't Make a Medical Glove

https://www.bloomberg.com/news/features/2026-07-07/why-it-s-so-difficult-to-produce-100-american-...
50•helsinkiandrew•2h ago•27 comments

An iroh powered smart fan

https://www.iroh.computer/blog/an-iroh-powered-smart-fan
116•surprisetalk•3d ago•31 comments

The vintage beauty of Soviet control rooms (2018)

https://designyoutrust.com/2018/01/vintage-beauty-soviet-control-rooms/
120•mvdtnz•6h ago•36 comments

An update on residential proxies and the scraper situation

https://lwn.net/SubscriberLink/1080822/990a8a5e2d379085/
210•chmaynard•15h ago•212 comments

Google Search lets creators know more about their reach

https://www.theverge.com/tech/961955/google-search-console-reach-platform-properties
11•herbertl•3d ago•3 comments

SpaceX wants to launch 100k more Starlink satellites for 100x the bandwidth

https://www.zdnet.com/home-and-office/networking/spacex-wants-to-launch-100000-more-starlink-sate...
196•CrankyBear•17h ago•652 comments

Good Tools Are Invisible

https://www.gingerbill.org/article/2026/07/10/good-tools-are-invisible/
451•theanonymousone•1d ago•209 comments

AI 2040: Plan A

https://ai-2040.com/
287•kschaul•1d ago•287 comments

Late Bronze Age Collapse

https://acoup.blog/2026/01/30/collections-the-late-bronze-age-collapse-a-very-brief-introduction/
376•dmonay•23h ago•259 comments

The tech of 'Terminator 2' – an oral history (2017)

https://vfxblog.com/2017/08/23/the-tech-of-terminator-2-an-oral-history/
219•markus_zhang•18h ago•78 comments

GPT-5.6 Sol Ultra produces proof of the Cycle Double Cover Conjecture [pdf]

https://cdn.openai.com/pdf/04d1d1e4-bc75-476a-97cf-49055cd98d31/cdc_proof.pdf
466•scrlk•16h ago•376 comments

Combustion engine web-based simulator

https://combustionlab.net
179•mytuny•5d ago•68 comments

Silent speech with ultrasound

https://alephneuro.com/blog/silent-speech
62•chrwn•3d ago•14 comments

Inference Optimization for MiMo v2.5: Pushing Hybrid SWA Efficiency to the Limit

https://mimo.xiaomi.com/blog/mimo-v2-5-inference
80•theanonymousone•4d ago•32 comments

Alternate clock designs and time systems

https://serialc.github.io/altClocks/
151•ethanpil•4d ago•83 comments

After 7 years in production, Scarf has reluctantly moved away from Haskell

https://avi.press/posts/2026-07-10-after-7-years-in-production-scarf-has-reluctantly-moved-away-f...
149•aviaviavi•21h ago•190 comments

New York City to ban deceptive subscription practices

https://www.theguardian.com/us-news/2026/jul/10/new-york-city-deceptive-subscriptions-ban
534•randycupertino•16h ago•255 comments

Show HN: Getting GLM 5.2 running on my slow computer

https://github.com/JustVugg/colibri
859•vforno•2d ago•214 comments

Lost city discovered beneath Egypt's desert with ancient church

https://www.dailymail.com/sciencetech/article-15956159/Incredible-lost-city-discovered-Egypts-des...
189•Bender•4d ago•133 comments

Snails' teeth beats spider silk as nature's strongest material (2015)

https://www.smithsonianmag.com/smart-news/spider-silk-loses-top-spot-natures-strongest-material-s...
194•simonebrunozzi•18h ago•148 comments

A love letter to flashcards

https://lesleylai.info/en/flashcards/
156•surprisetalk•19h ago•98 comments

Computation as a universal and fundamental concept

https://ergo.org/courses/computation-as-a-universal-and-fundamental-concept
135•simonpure•19h ago•95 comments

Preemption is GC for memory reordering (2019)

https://pvk.ca/Blog/2019/01/09/preemption-is-gc-for-memory-reordering/
39•mpweiher•2d ago•6 comments

Moss (YC F25) Is Hiring

https://www.ycombinator.com/companies/moss/jobs/52LnqLQ-software-engineer-sdk
1•srimalireddi•14h ago

Documentation is still in your Mum's filing cabinet

https://gerireid.com/blog/organising-documentation-for-humans-and-ai/
21•mooreds•3d ago•6 comments

War Atlas: An interactive cartography of every named war in human history

https://waratlas.org
156•NaOH•17h ago•67 comments