The text mode lie: why modern TUIs are a nightmare for accessibility — The Inclusive Lens xogium.me/the-text-mode-lie-wh… #Accessibility #CLI #TUI


The text mode lie: why modern TUIs are a nightmare for accessibility


The mythical, it's text, so it's accessible


There is a persistent misconception among sighted developers: if an application runs in a terminal, it is inherently accessible. The logic assumes that because there are no graphics, no complex DOM, and no WebGL canvases, the content is just raw ASCII text that a screen reader can easily parse.

The reality is different. Most modern Text User Interfaces (TUIs) are often more hostile to accessibility than poorly coded graphical interfaces. The very tools designed to improve the Developer Experience (DX) in the terminal—frameworks like Ink (JS/React), Bubble Tea (Go), or tcell—are actively destroying the experience for blind users.

The Architectural Flaw: Stream vs. Grid


To understand the failure, we must distinguish between two distinct concepts often conflated under “terminal apps”: the CLI (Command Line Interface) and the TUI.

  1. The CLI (The Stream): This operates on a standard input/output model (stdin/stdout). You type a command, the system appends the result below, and the cursor moves down. This is linear and chronological. For a screen reader, specifically kernel-level readers like Speakup, this is ideal.
  2. The TUI (The Grid): This treats the terminal window not as a stream of text, but as a 2D grid of pixels, where every character cell is a pixel. It abandons the temporal flow for a spatial layout.


Case Study: The gemini-cli Madness


Let's look at a concrete example: gemini-cli, a tool written in Node.js using the Ink framework. On the surface, it looks like a simple chat interface. But underneath, Ink is trying to reconcile a React component tree into a terminal grid.

When you use this tool with Speakup (Linux) or NVDA (Windows), the application doesn't just fail; it actively spams you.

Because the framework treats the screen as a reactive canvas, every update triggers a redraw. When the AI is “thinking,” the tool updates a timer or a spinner. To do this, it moves the hardware cursor to the timer location, writes the new time, and moves it back.

For a sighted user, this happens instantly. For a screen reader user, this is what you hear:“Responding... Time elapsed 1s... Responding... Time elapsed 2s... [Fragment of chat history]... Responding...”

It drives the screen reader mad. The cursor is teleporting all over the screen to update status indicators, spinners, and history. Speakup tries to read whatever is under the cursor at that exact millisecond. You end up hearing random bits of conversation mixed with timer updates, making it impossible to focus on what you are actually typing.

Worse, lets pretend that you've somehow managed well with speakup so far, but that you want to do some work with nvda. Maybe paste an error you're getting on windows. So you open your terminal, ssh into your linux box, attach to your screen session and paste your text.

The result is an immediate crash of the screen reader (NVDA) or massive system instability. Why? Every time you type a character or paste text, the application triggers a state change. The framework decides it needs to re-render the interface. Because the conversation history is part of that state, the application attempts to redraw or re-calculate the layout for thousands of lines of text instantly. The more messages you have in a conversation, the more this will happen. And no, you can't just avoid this by using insert+5, the key combo supposed to avoid announcing dynamic change of content.

The Lag Loop


Furthermore, frameworks like Ink running on single-threaded environments (like Node.js) suffer from massive performance degradation when the history grows. If you paste a large block of text, the system has to calculate the diff for thousands of lines.

This causes input lag. You press a key, and you wait. You can wait up to 10 seconds for a single character to echo back. The system is too busy calculating how to redraw the screen to actually process your input.

Why The “Old Guard” Works (nano, vim, menuconfig)


Sighted developers often ask: “If TUIs are bad, why do you use nano, vim, or menuconfig?”

The answer is not that these tools handle the cursor perfectly by default. The answer is that they allow you to hide the cursor entirely.

1. Hiding the Cursor (nano, vim)


In tools like nano or vim, usability depends on turning off features that track cursor position. If you run nano with options that show the cursor position (like --constantshow), or if you use vim without specific configuration, the experience is broken.

When the cursor is visible and tracking is active, Speakup prioritizes the cursor's location update over the character echo. Instead of hearing the letter “a” when you type it, you hear “Column 2”. You type “b”, and you hear “Column 3”.

These older tools succeed because they allow you to disable this noise. You can configure them to suppress the visual cursor or status bar updates, forcing the screen reader to rely on the character input stream rather than the noisy coordinate updates. Modern frameworks rarely offer a “no-cursor” or “headless” mode; they assume the visual cursor is essential.

2. Single Column Focus (menuconfig)


Tools like the Linux kernel's menuconfig work because they enforce a strict, single-column focus. Even though there are borders and titles, the active area is a vertical list. The cursor stays pinned to that list. It doesn't jump to the bottom right to update a clock, then to the top left to update a title. The spatial complexity is kept low enough that the screen reader never gets “lost.”

3. The Lost Art of Scrolling Regions (Irssi)


Irssi is the gold standard for accessible chat, but not because of luck. Irssi was built over 20 years with a custom rendering engine that utilizes VT100 Scrolling Regions.

When a new message arrives in Irssi: 1. It tells the terminal driver: “Define a scrolling region from line 1 to 23.”2. It sends a command: “Scroll up.” The terminal moves the bits up. 3. It draws the new text at the bottom of that region.

Crucially, it handles this in a way that minimizes interference with the input line. It relies on the terminal's hardware capabilities rather than rewriting every character on the screen manually. Modern frameworks ignore these hardware features in favor of “diffing” the screen state and rewriting characters, which is computationally heavier and hostile to accessibility.

The “Stale Bot” excuse: A Case Study in Neglect


Google and the maintainers of gemini-cli pretend to care about accessibility. “Pretend” is the operative word here. If you look at the repository, critical accessibility regressions like Issue #3435 and Issue #11305 have been left to rot. There is no discussion, no roadmap, and no fix. Even worse is the fate of Issue #1553, which was supposed to track these accessibility failures. It didn't get solved; it got silenced. It was closed automatically by a bot with this generic dismissal: > Hello! As part of our effort to keep our backlog manageable and focus on the most active issues, we are tidying up older reports. It looks like this > issue hasn't been active for a while, so we are closing it for now.”

This is unacceptable. Closing an accessibility report because the maintainers haven't touched it in months is not “tidying up”; it is hiding evidence. It effectively says that if a bug is ignored long enough, it ceases to exist. It boosts the project's “Closed Issues” metric while leaving the actual software unusable for blind users.

Conclusion


If you are building for the terminal and care about accessibility, stop using declarative UI frameworks that treat the terminal like a canvas.

The “modern” TUI stack has optimized for the developer's ability to write React-like code at the expense of the machine's ability to render text efficiently.

If you cannot guarantee that your application allows the user to hide the cursor, or if you rely on aggressive redrawing to show spinners and timers, you are building an inaccessible tool.

For the blind user, a dumb, linear CLI stream is infinitely superior to a “smart” TUI that lags, spams, and scatters the cursor across the screen.


reshared this

As someone who uses Eloquence on all my devices, this was a very educational article on the state of Eloquence itself. This also includes other contenders which, at this moment in time, don't really exist. Sam's Stuff - The State of Modern AI Text To Speech Systems for Screen Reader Users stuff.interfree.ca/2026/01/05/…

reshared this

RE: mastodon.social/@Tutanota/1158…

Update: Office has not been renamed to, "Microsoft 365 Copilot App"

Like everyone else on the internet Microsoft also has us confused.

Thanks to @tomwarren we now understand what's changing.

You can find out here: theverge.com/tech/856149/micro…


🚨 BREAKING: Microsoft just renamed Office to "Microsoft 365 Copilot app"

All users are now "AI users"

And this will lead to higher prices: tuta.com/blog/microsoft-365-pr…

#Microsoft #Copilot


✏️ 5 accessibility checks to run on every component zeroheight.com/blog/5-accessib…

I guest-posted on zeroheight's blog about accessibility of components!

(note: WCAG compliance is claimed on full pages/processes only)

I just got this response from NVDA's AI content describer addon, the addon that's uh, you know, supposed to describe images for people? "I’m not able to view images, so I can’t describe it directly. If you can either paste the image text or give me a brief summary of what’s in it, I’ll gladly help craft a detailed description for you." You had one job

reshared this

This one is a bit specific, but who knows. For the Dutch techies in the energy sector, Alliander is looking for an Open Source Specialist! ⚡

#fedihire #fossjobs #getfediHired

werkenbij.alliander.com/vacatu…

Do you know someone who quietly makes the Django community better every day? Or maybe that someone is you? 👀✨

The Django Software Foundation appoints Individual Members to recognize contributions of all kinds: code, docs, reviews, teaching, events, community care, and more 💚

You can nominate someone you admire or self-nominate (yes, really!) 🙌

Members list: 🤗
djangoproject.com/foundation/i…

Nominate here: ✅
docs.google.com/forms/d/e/1FAI…

CC @django

#Django #DSF #Community #Python #OpenSource

This entry was edited (1 week ago)
in reply to Štěpán Škorpil

Všiměte si, že mají Krakonoše vyfoceného ve stejném stavu. Reportéři tam dorazili zrovna když jsem si to fotil. 😁
irozhlas.cz/kultura/vytvarne-u…

#IzzyOnDroid is about community. That's why we don't want our #FOSDEM visit to be just about us, but also about all the amazing apps that make IzzyOnDroid so great.

Do you have an app that's available on IzzyOnDroid? Bring some stickers with you to FOSDEM and drop them off at our booth! We'll make sure to display them so your users can pick some up!

Sylvia reshared this.

Is see Danish citizens online are now proposing to invade USA and MAAG. (Make America Actually Great)
Under occupation they would ensure Americans got.
Universal healthcare
Fairer wages + lower income inequality
Paid parental leave
Bike-friendly cities
Free college options
Fewer work hours
Reliable public transportation
Stronger social safety net
-
#Denmark #USA #USpol #Politics

RE: mastodon.social/@Tutanota/1158…

Microsoft just turned all Office users into AI users. Lmao. It’s now called the "Microsoft 365 Copilot" app. Get ready for fee increases and having your data opted into training by default with confusing settings. Enshittification has peaked.


🚨 BREAKING: Microsoft just renamed Office to "Microsoft 365 Copilot app"

All users are now "AI users"

And this will lead to higher prices: tuta.com/blog/microsoft-365-pr…

#Microsoft #Copilot


I wish I could just start texting people. Be it just a hey how are you, what did you do yesterday etc, but I feel like that's not common anymore because it has been taken up by Instagram, SnapChat and what not other stuff. I don't want that. I don't want all this image based crap. Just give me back good old text messages. But why would people text stuff to one random person if they can share everything they want with one inaccessible image to all their friends?
This entry was edited (1 week ago)

I cancelled my Zoom subscription today.

Not for some higher reason, but the client I used it with mostly before is switching to Google Meet (yeah…) and so I am looking into alternatives.

I’ll probably do @OpenTalkMeeting as it is hosted in Germany and has fun functionality like the talking stick and coffee breaks. Also half the price for a year.

docs.opentalk.eu/25.4/user/en/…
docs.opentalk.eu/25.4/user/en/…

in reply to Marco Zehe

@marcozehe Dial-in by phone is certainly listed as a feature. I’d rather have a dedicated app instead of a browser-based solution, but apparently I’m alone in that. What will be annoying is no Calendar integration (Fantastical).

opentalk.eu/en/product/feature…

Bahnfahren leichter gemacht: Erste Stufe der Online-Buchung für Menschen mit Schwerbehindertenausweis jetzt live bsvh.org/nachricht/bahnfahren-…

Hlasovanie o dekarbonizácii a modernizácii rybnéo hospodárstva EÚ


Európsky parlament prijal uznesenie o dekarbonizácii a modernejšej podobe rybolovu v Európskej únii. Tento text reflektuje potrebu postupne znižovať emisie a zlepšiť environmentálne a sociálne fungovanie celého rybárskeho sektora v rámci Európy. Uznesenie nadväzuje na hodnotenie, ktoré pripravila Výbor pre rybolov, a spája ciele Európskeho zeleného dohovoru s realitou fungovania rybárskych flotíl a komunit závislých od rybolovu. 

Parlament pripomína, že dosiahnutie klimatickej neutrality do roku 2050 vyžaduje spravodlivý a udržateľný prechod celého rybolovného sektora, ktorý zohľadní environmentálne, sociálne aj hospodárske aspekty. Uznesenie vyzýva na vytvorenie realistického a postupného plánu pre dekarbonizáciu rybárskych plavidiel a zníženie ich uhlíkovej stopy, pričom sa berie do úvahy rozmanitosť typov lodí, operácií aj regionálnych podmienok v celej Únii. 

Text uznesenia zdôrazňuje, že prechod na ekologickejšie palivá, alternativne pohony a iné technológie si vyžaduje významné investície do výskumu, vývoja, infraštruktúry a školenia posádok, ako aj spoluprácu medzi členskými štátmi, úradmi a odborníkmi. Tieto opatrenia majú zároveň vytvoriť priestor pre inovácie a modernizáciu flotíl bez poškodzovania sociálno-ekonomickej stability rybárskych komunít, najmä malých a pobrežných operátorov, ktorí predstavujú výraznú časť európskeho rybárskeho sektora. 

Uznesenie tiež upozorňuje, že riešenie finančných a legislatívnych prekážok je kľúčové, pretože súčasné pravidlá a finančné nástroje nie vždy dostatočne podporujú modernizáciu a udržateľné praktiky. Parlament vyzýva Európsku komisiu a členské štáty, aby prehodnotili a upravili existujúce mechanizmy, vrátane fondov EÚ, tak, aby umožnili prístup k financovaniu, ktoré je primerané potrebám prechodu k nízkouhlíkovému rybolovu. 

in reply to Ep_prehladne

Z dlhodobého (aj strednodobého!) hľadiska by sme radšej mali prestať zabíjať zvieratá len pre to aby sme sa najedli. Rybie mäso je zdravé a bola by škoda ho úplne vynechať. Oveľa lepšie by bolo rybie mäso hlavne kultivovať v bioreaktoroch - to by mohli robiť veľkoproducenti. Malí rybári nech kľudne ostanú pri svojom remesle - som si istý, že mnohí ľudí bude ich mäso kupovať aj v čase ľahko a lacno dostupného kultivovaného mäsa.

"President Donald Trump may have made a major miscalculation about Venezuela’s oil.

Trump has expressed excitement over the prospect of US oil companies getting their hands on Venezuela’s vast oil resources.

But industry sources tell CNN that American oil executives are unlikely to dive headfirst into Venezuela for multiple reasons: The situation on the ground remains very uncertain, Venezuela’s oil industry is in shambles and Caracas has a history of seizing US oil assets.

Perhaps the biggest problem is that oil prices are too low today to justify spending the gobs of money – possibly tens of billions of dollars – that would be required to revive Venezuela’s decaying oil industry.

“The appetite for jumping into Venezuela right now is pretty low. We have no idea what the government there will look like,” one well-placed industry source told CNN on Monday. “The president’s desire is different than the industry’s. And the White House would have known that if they had communicated with the industry prior to the operation on Saturday.”"

edition.cnn.com/2026/01/05/bus…

#USA #Trump #Venezuela #Maduro #Oil #FossilFuels

David Rosen, co-founder of SEGA, just died. He was 95 years old.

Wait. He wasn’t Japanese?

That’s right. SEGA started as an American company. The reason SEGA is capitalized is because the original name was Service Games. And the “Service” in that name refers to the American military—its first customer base.

SEGA remained largely American until the 1980s, when David Rosen—along with Japanese business partners—bought the company from its parent, Gulf+Western, which also owned Paramount Pictures.

This initiated one of the most innovative and creative periods in video game history. SEGA produced classics like Space Harrier, OutRun, Sonic the Hedgehog, Streets of Rage, and Virtua Fighter.

For nearly two decades, SEGA was the primary rival to Nintendo, separating itself through speed and attitude.

Along with Atari, it was one of the companies that defined my childhood.

R.I.P., David Rosen. May you enjoy that great arcade in the sky.

theguardian.com/games/2026/jan…

reshared this

Three years ago I bought @juliette an electric kettle for her birthday (because romance is not dead).

Looking for a stainless tank, hidden heating element, and temperature settings, I found the Krups KE07. Bit expensive, but it'll last decades. Right? Button 1 broke after a year. Button 2 today..

Thread in three parts

1. How it broke

2. Why I think you should not buy a Krups / Tefal appliance

3. How to fix it with a 3D printed part

1/x

#enshittification #plannedobsolescence #righttorepair

This entry was edited (1 week ago)

@bert_hubert I think this can use some extra attention: The .be registry wants to leave AWS and has created an RFP with lots of details of what they need. I think this could be the first sheep over the dam. I hope you can bring extra attention to this and a precedent can be created.
dnsbelgium.be/en/news/dns-belg…

Who approves licenses of subscriptions in a company in the end who buys, like via whose decisions do startups in sv remain afloat or die

When an enterprise buys from a startup, who actually signs off? Trying to understand who the real decision-maker is in the buying process

People who can approve or release budget for recurring software subscriptions inside organizations.

This entry was edited (1 week ago)

You know I wonder if they even think about what they say. If anyone who talks about me, or the stuff I do knows that it hurts? Since apparently it's not interesting, or useless, or no one understands, or I should just do something else. Yeah title him as nerd and let him do whatever, people don't like nerds blahh blah. You fucking, yes fucking know that it hurts, you don't have to understand it, but you can accept it, you don't have to understand the concept, or even the principle, but the fact that it's a hobby like every other, that you get joy from it, that you don't have to downtalk it and label it as something bad. Cuz it makes me feel bad fucker.
This entry was edited (1 week ago)
in reply to Jonathan

Obviously I don't know the particulars of your circumstances and your family history, so this advice could be entirely inappropriate, but don't wait for permission. If you wanna help your Grandad, hit him up, like today. Send him an email or phone him or go visit. Hey Grandad heard you want a Smart Phone. What would you most like it for. there are these options. Not an overwhelm of information, just enough to show your knowledge and will to help.
in reply to Jonathan

The key part of my post, which got buried in the implementation, is don't wait for permission or approval. Don't wait to be allocated the task. Allocate it to yourself. Volunteer! Why am I saying this? Because I've discovered over the past couple of years that I have spent too much of my life waiting for my ideas to be signed off on rather than just going ahead and making them happen.

Jonathan reshared this.

in reply to Jonathan

I've lived too much of my life, not for other people as such, not in their service, but to their schedules, fitting in with their expectations, what they approve of, what they permit me to do. By doing that, I automatically make myself subordinate to them rather than on an equal footing. Be on an equal footing. You have skills. You don't need other people's permission to use them.

Jonathan reshared this.

in reply to Jonathan

It's your life. they're your skills. It's your desire to help. Stepping forward means that yes you are putting yourself out there for rejection, for people to prefer someone else's advice and yes that will be mega mega hard if you're anything like me, but don't wait for life to happen to you...happen to it! You don't need to be told it's okay to do something, that you are considered worthy. Go for it.

I love my family. My father is dissatisfied cuz I finally do something for the security of my mom and manage her Bitwarden. He says the normal apple passwords app is enough. I quote his conversation to my mom: "Why do you even let him do that nerd shit, there is the apple passwords application which stores all your pass keys." With my mom going on about how she didn't even know what passkeys are, and that she's glad someone is at least doing something and explaining stuff. And may I mention that she forgot her Apple ID password, and Apple does not offer the same recovery methods as Bitwarden, such as backups through the API I can easily manage, etc. But yeah right, the apple passwords app without backups will just be fine for someone who recently locked themselves out of their half life. Holy shit I can't stand naive idiots, but yeahr right I'm the shitty nerd bitch, for using a proper password manager, fuck off man.
This entry was edited (1 week ago)