The audience I keep forgetting is the answer engine that reads a page once, without a browser, and never comes back to check whether the content arrived late.
This is not a speed argument. A page that renders in eighty milliseconds after a fetch still renders in zero characters for a reader that never fetches. The rule that follows is blunt: no content may require a script to appear.
What it costs
Less than you would think, and in exactly one place. Interactivity that decorates content is free to ship, because losing it loses nothing a reader needed. Interactivity that carries content is the thing to refuse.
---
title: "Writing for readers who cannot run JavaScript"
description: "Most crawlers that read for an answer engine do not execute scripts. That is a content constraint, not a performance one."
url: "https://lateano.com/writing/writing-for-readers-who-cannot-run-javascript"
author: "Colin Lateano"
published: "2026-06-28"
tags:
- title: "Things I'm figuring out"
url: "https://lateano.com/tags/figuring-it-out"
---
# Writing for readers who cannot run JavaScript
Most crawlers that read for an answer engine do not execute scripts. That is a content constraint, not a performance one.
The audience I keep forgetting is the [answer engine](/glossary/answer-engine) that reads a page once, without a browser, and never comes back to check whether the content arrived late.
This is not a speed argument. A page that renders in eighty milliseconds after a fetch still renders in zero characters for a reader that never fetches. The rule that follows is blunt: no content may require a script to appear.
## What it costs
Less than you would think, and in exactly one place. Interactivity that decorates content is free to ship, because losing it loses nothing a reader needed. Interactivity that carries content is the thing to refuse.
> [!NOTE]
> A filter that hides list items is decoration. A filter that fetches the list is content. They look identical in a screenshot.