CLAUDE LABJP
SUNSET — The legacy Workbench and experimental prompt tool APIs retire tomorrow, August 17, one day outLATEST — Version 2.1.233, released August 15, is current: GitLab merge request URLs now work with --worktree and the claude agents view, where MRs appear as !NSECURITY — Windows paths written with the NT \??\ device prefix no longer bypass UNC validation, closing an NTLM credential-leak vectorTODO — Todo and task tracking tools are off by default on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models; set CLAUDE_CODE_ENABLE_TODO_TOOLS=1 to bring them backFORK — Version 2.1.232, released August 14, makes subagent_type: 'fork' the default, so a forked subagent inherits the full conversation and prompt cacheMENTION — Typing @ in the prompt now mentions another Claude session by name, and SendMessage reaches that session directlySUNSET — The legacy Workbench and experimental prompt tool APIs retire tomorrow, August 17, one day outLATEST — Version 2.1.233, released August 15, is current: GitLab merge request URLs now work with --worktree and the claude agents view, where MRs appear as !NSECURITY — Windows paths written with the NT \??\ device prefix no longer bypass UNC validation, closing an NTLM credential-leak vectorTODO — Todo and task tracking tools are off by default on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models; set CLAUDE_CODE_ENABLE_TODO_TOOLS=1 to bring them backFORK — Version 2.1.232, released August 14, makes subagent_type: 'fork' the default, so a forked subagent inherits the full conversation and prompt cacheMENTION — Typing @ in the prompt now mentions another Claude session by name, and SendMessage reaches that session directly
Articles/Claude Code
Claude Code/2026-07-16Intermediate

Switching Claude Code to Plain-Text Rendering — Three Ways In, and What Your Logs Actually Weigh

I opened last night's Claude Code log and found the same spinner line stacked dozens of times. Here are the three ways to turn on screen reader mode, a short script that measures what escape sequences and redraws really cost you, and what you give up when the rendering goes plain.

Claude Code221AccessibilityTerminal2Log Design2

Premium Article

I opened last night's log over coffee and just stared at it for a while. The file was 1,800 lines, and most of them were the same progress line. That spinner next to "Thinking…" had been dutifully stacking one row per frame.

On screen, that line only ever existed once. The cursor kept returning to the start, the same spot got repainted, and my eyes read it as a single line. The log file was simply being honest about every repaint along the way.

What the terminal shows you and what flows down the pipe are two different artifacts. I thought I understood that. I had the size of the gap badly wrong until I counted my own log.

There Is a Setting That Changes the Rendering Itself

Claude Code has an opt-in setting called screen reader mode. As the name says, it exists for people using screen readers, and turning it on switches output to plain-text rendering.

It also matters if you never touch assistive technology. A screen that a screen reader struggles to announce and a log that grep or diff struggles to handle fail for the same reason. Cursor moves that repaint the same position, escape sequences that add color, wrapping tuned to your terminal width — helpful when a human is watching, pure noise when a machine reads it later.

So screen reader mode is an accessibility setting, and it is also an answer to a different question: is anyone going to read this output again after the run? I came at it from the second question, not the first.

Three Ways In, and When Each One Fits

There are three activation paths. One would seem like enough, except that they differ in scope, which means in practice you want all three.

PathHowScopeWhen I reach for it
CLI flagclaude --ax-screen-readerThat session onlyFirst try. Undoing it means restarting
Env varCLAUDE_AX_SCREEN_READER=1That shell and its childrenPrefixing only the runs I want captured
Settings file"axScreenReader": trueEvery session in that environmentOnce it has earned permanence

The environment variable earns the most use in day-to-day operation. Because it goes in front of the command, it applies to exactly the runs whose output I want to keep.

# Plain rendering for this one run, raw output saved to disk
CLAUDE_AX_SCREEN_READER=1 claude -p "list duplicated constants under src/config" \
  > "$HOME/logs/claude-$(date +%Y%m%d-%H%M%S).log" 2>&1

For the settings file, it is one line of JSON.

{
  "axScreenReader": true
}

Try the flag, move to the env var for the runs that need it, and only then write it into settings if you want it everywhere. Starting at the settings file is how you end up unsure which rendering mode you are actually in when something looks off.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Pick between the three activation paths (--ax-screen-reader, CLAUDE_AX_SCREEN_READER, the axScreenReader setting) based on whether you want a one-off, a per-run switch, or a permanent change
A 40-line script that weighs a log in four stages, so you decide your capture format from numbers rather than a hunch
A clear picture of what plain rendering costs you — in-place progress, diff coloring, width-aware wrapping — so you know when to switch back
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Claude Code2026-07-17
My Nightly Subagents Ran, and I Couldn't Retrace Them — Trimming the Logs That --forward-subagent-text Unleashed
Subagent text and thinking can now flow into stream-json output, and unattended log volume climbs sharply with it. Here are measured numbers, a three-tier retention filter that keeps only what postmortems need, and a correlation ID design that survives missing fields.
Claude Code2026-07-15
Keeping Unattended Logs Readable — Measuring axScreenReader's Plain-Text Rendering Before Adopting It
Piping Claude Code into a log file leaves you with escape codes and redraw debris instead of an answer. Here is how I enabled axScreenReader across its three entry points, measured the difference on one real task, and moved my unattended runs over to it.
Claude Code2026-08-16
A Runaway Build Dies Very Differently Under cgroup Than Under ulimit
Claude Code v2.1.233 added opt-in memory cgroup support for Bash tool commands on Linux. Capping virtual address space with ulimit -v and capping physical memory with a cgroup produce completely different failures — and only one of them lets your Node build start at all.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →