CLI is unuseable with a screen reader while text is streaming due to repeated/partial announcements of incoming text
What version of Codex CLI is running?
0.101.0
What subscription do you have?
Plus
Which model were you using?
gpt-5.3-codex
What platform is your computer?
Microsoft Windows NT 10.0.26200.0 x64
What terminal emulator and version are you using (if applicable)?
Windows Terminal
What issue are you seeing?
I'm using the NVDA screen reader.
When Codex TUI is actively working, it frequently rewrites existing lines (status row animation, elapsed timer ticks, streaming exec output updates, and row clear/rewrite behavior).
These rewrites are detected as new content and cause repeated/partial announcements, which makes ongoing output impossible to follow. For example, it announces characters written not as full intelligible words but as partial words depending on the streaming response. These announcements are also frequent enough that I often have to wait for Codex to finish working before looking at what it did.
What steps can reproduce the bug?
- Use a screen reader like NVDA on Windows
- Use Codex and ask it to do something
- Observe NVDA announcements: repeated partial/full re-announcement of changing lines during active work.
What is the expected behavior?
Screen-reader users should hear stable, coherent append-oriented updates, not repeated announcements caused by visual-only redraw churn or in-place line rewrites.
A long-running turn should stream without repeatedly re-announcing the same line content.
Additional information
The issue is caused by a mismatch between how the TUI renders updates and how screen readers consume terminal changes. Codex currently uses differential rendering that frequently clears and rewrites existing rows (including status animation/timer redraws and in-place streaming exec updates).
In Windows Terminal, those change events get sent to NVDA so it is able to announce the update. Those rewrites get treated as fresh content changes, so even minor edits to an existing line are announced again as full/partial new output.
sync_update blocks do not fix this when they contain large multi-line rewrites; the core problem is line mutation (clear + rewrite), not simple appending of new lines.
I used Codex to implement an opt-in fix (via `screen_reader setting) and in my testing, it fixes the issue for me.
- Added
tui.screen_reader_mode(default false) in config. - Suppressed visual-only high-frequency redraws in screen-reader mode (spinner/shimmer and elapsed-time tick redraw pressure).
- Changed exec handling in screen-reader mode to buffer during execution and emit one finalized summarized exec block at command end (instead of per-chunk in-place mutation).
- Reduced unnecessary terminal churn by only emitting clear-to-end when trailing row content actually differs.
- Added/updated tests in TUI modules for these behaviors.