Why is it so hard to proofread your own writing?
Because you are reading what you meant, not what is on the page. Your brain has the intended text available and fills in from it, so errors become genuinely invisible rather than merely overlooked.
What is actually happening. Reading is prediction. Skilled readers do not process every letter; they sample and predict from context, which is why you can read text with scrambled interiors or missing letters. When you wrote the text, you hold the intended version in memory — the strongest possible context — so prediction overrides perception almost completely.
This also explains the specific pattern of errors that survive:
Correctly spelled wrong words — form for from, their for there, manger for manager. Spellcheck passes them and your eye supplies the intended word.
Omitted small words, which prediction inserts for you.
Doubled words across a line break.
Errors in headings and large type, which are skipped because you are not reading them.
Errors in familiar passages — the ones you have reread most are the ones you see least.
What actually works, and why:
Time. Put it away for a day or more so the memory of the intended text fades. This is the single most effective technique and the one people skip.
Change the appearance. Different font, size, column width, or print it. This breaks the visual pattern your eye has memorised and forces genuine reading.
Read it aloud, which forces every word through a slower channel and exposes rhythm problems and omissions simultaneously.
Read backwards, sentence by sentence, which removes the narrative context prediction depends on. Useful for a final spelling pass, useless for sense.
Read on a different device, or have software read it to you.
Proofread for one thing at a time — names and numbers, then punctuation, then spelling. Trying to catch everything catches less.
Someone else. Another reader has no intended version in their head, which is the whole advantage, and is why professional proofreading exists as a job.
Check what spellcheck cannot: names, numbers, dates, links and captions.