I don't think this is necessary. The other coders are prettier, but in some of them you can't use normal terminal scroll or it's a pain to copy code from the terminal. And many use aider in very small terminals in vscode/pycharm, where every line is valuable and shouldn't be wasted with a fancy border around the code or something like that. There is no need for elements that wast space in the terminal, sometimes less is more. I like the distraction free aider UI as it is.
There are far more needed features:
Save a session into a file and restore it, to get all context and messages:
It's a pain to restart aider, when the chat context matters for future steps. I know, you could tell aider to store a plan into a file, but that feels unnecessary and you may loose nuances.
Write into Files that are not added to git:
Sometimes i generate a temporary plan/design into a markdown file and i don't like to add this temp file into the repo, but i have to so that aider can write into it.
But thank you for your afford to keep our favorite coder alive 👍
Reacted by Dustin Washington, Linhan Wang, Stéphane Klein, bdutta, Abhijit Amin and Stéphane Lavergne
I also personally think aider's UI is fine as it is right now. I've ran around here and there trying out TUI coding agents, but Aider's simplicity is honestly what makes me keep coming back to it.
Yeah this is fair. I see a world where the TUI mode is just like the GUI mode, definitely optional but that's probably me just really liking Gemini cli's interface. I do see how session support for basic resumability and what y'all are describing for a plan -> apply workflow are more helpful though. Thank you for the feedback
@dwash96, is there a config setting to turn off the new TUI experience? In the integrated VSCode terminal, the new UI is not behaving nicely (no prompt in architect mode, formatting all over the place).
aider/coders/architect_coder.py:17: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited
if not self.auto_accept_architect and not self.io.confirm_ask("Edit the files?"):
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
I will debug more and file bugs but I was wondering if there is a feature flag that allows me to turn this off for now. Ty!
@dwash96 thanks for the commit. Unfortunately, I am still having problems (and a few more):
Now, I get a prompt to agree to the changes. And, when confirmed, aider makes the edits. However, it looks like something is still working in the async loop because the code crashes with this:
architect multi> `last_error` should be displayed in red.
Aider v0.88.2
Main model: gpt-5 with architect edit format, reasoning high
Editor model: gpt-5 with editor-diff edit format
Weak model: gpt-5-nano
Git repo: ../macro/.git/worktrees/macro-PMSAX-72.ds with 676 files
Repo-map: using 4096 tokens, files refresh
MCP servers configured: dagster-docs-mcp
Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Change required
Make the status pane that displays last_error render its text in red.
Where to change
In com/cat/utils/scripts/overrides.py inside build_view(), find the status pane initialization:
- Current:
status_md = pn.pane.Markdown(model.last_error, width=600)
- Update:
Add a styles dict setting the color to red:
status_md = pn.pane.Markdown(model.last_error, width=600, styles={"color": "red"})
Why
This ensures whatever string is assigned to last_error is rendered in red consistently. The existing watcher that updates status_md.object will continue to work and the style
persists across updates.
Optional (if you want red only for errors)
If later you decide to color only when it’s an error (and use a neutral color for info messages), change the watcher to also set styles conditionally based on e.new (e.g., if
"failed", "error" in message), but that’s not required for this request.
Tokens: 110k sent, 202 received. Cost: $0.14 message, $0.16 session.
Edit the files? (Y)es/(N)o [Yes]: y
[10/29/25 17:23:38] INFO Processing request of type ListToolsRequest server.py:674
com/cat/utils/scripts/overrides.py
````python
<<<<<<< SEARCH
status_md = pn.pane.Markdown(model.last_error, width=600)
=======
status_md = pn.pane.Markdown(model.last_error, width=600, styles={"color": "red"})
>>>>>>> REPLACE
Tokens: 108k sent, 61 received. Cost: $0.14 message, $0.29 session.
Applied edit to com/cat/utils/scripts/overrides.py
Commit c3bd4a5 style: render last_error status text in red in status pane
You can use /undo to undo and discard each aider commit.
Aider v0.88.2
Main model: gpt-5 with architect edit format, reasoning high
Editor model: gpt-5 with editor-diff edit format
Weak model: gpt-5-nano
Git repo: ../macro/.git/worktrees/macro-PMSAX-72.ds with 676 files
Repo-map: using 4096 tokens, files refresh
MCP servers configured: dagster-docs-mcp
Restored previous conversation history.
Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I see the change is in place: last_error is rendered in red via styles={"color": "red"}.
If you want more than fixed red, confirm and I’ll guide you to:
- Conditional coloring: red for errors, green for success, neutral/grey otherwise.
- Replace the current watcher with a handler that updates both object and styles based on the message content (e.g., contains "error"/"failed" → red; "inserted"/"transform
applied" → green; empty → grey).
- Initialize status_md with the same style function so it’s correct on load.
- Optional: auto-clear non-error messages after a short delay.
- In the same handler, if the message is a success/info, schedule a pn.state.add_periodic_callback to clear model.last_error after N seconds (and stop the callback).
Say “yes” if you want this, and I’ll provide precise steps.
Edit the files? (Y)es/(N)o [Yes]:
ERROR:asyncio:an error occurred during closing of asynchronous generator <async_generator object stdio_client at 0xffff73d5d000>
asyncgen: <async_generator object stdio_client at 0xffff73d5d000>
+ Exception Group Traceback (most recent call last):
| File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 781, in __aexit__
| raise BaseExceptionGroup(
| BaseExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/mcp/client/stdio/__init__.py", line 189, in stdio_client
| yield read_stream, write_stream
| GeneratorExit
+------------------------------------
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/mcp/client/stdio/__init__.py", line 183, in stdio_client
anyio.create_task_group() as tg,
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 787, in __aexit__
if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 459, in __exit__
raise RuntimeError(
RuntimeError: Attempted to exit cancel scope in a different task than it was entered in
# Uncaught AssertionError in application.py line 651
Aider version: 0.88.2
Python version: 3.12.10
Platform: Linux-6.1.147-172.266.amzn2023.aarch64-aarch64-with-glibc2.34
Python implementation: CPython
Virtual environment: Yes
OS: Linux 6.1.147-172.266.amzn2023.aarch64 (64bit)
Git version: git version 2.50.1
An uncaught exception occurred:
Traceback (most recent call last):
File "aider-ce", line 10, in <module>
sys.exit(main())
^^^^^^
File "main.py", line 474, in main
return asyncio.run(main_async(argv, input, output, force_git_root, return_coder))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "runners.py", line 195, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "base_events.py", line 691, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "main.py", line 1212, in main_async
await coder.run()
File "base_coder.py", line 1065, in run
return await self._run_patched(with_message, preproc)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "base_coder.py", line 1132, in _run_patched
await processing_task
File "base_coder.py", line 1172, in _processing_logic
await self.run_one(user_message, preproc)
File "base_coder.py", line 1228, in run_one
async for _ in self.send_message(message):
File "base_coder.py", line 1994, in send_message
if await self.reply_completed():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "architect_coder.py", line 17, in reply_completed
if not self.auto_accept_architect and not await self.io.confirm_ask("Edit the files?"):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "io.py", line 84, in wrapper
return await func(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "io.py", line 1022, in confirm_ask
return await asyncio.create_task(self._confirm_ask(*args, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "io.py", line 1128, in _confirm_ask
res = await prompt_task
^^^^^^^^^^^^^^^^^
File "prompt.py", line 1252, in prompt_async
return await self.app.run_async(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "application.py", line 651, in run_async
assert not self._is_running, "Application is already running."
^^^^^^^^^^^^^^^^^^^^
AssertionError: Application is already running.
Please consider reporting this bug to help improve aider!
/test does not seem to work anymore. The tests run and the lines of output are added to the chat but the LLM is not invoked. In classic aider, test errors would invoke the LLM automatically. Even manually requesting doesn't work.
my 2c, for what it's worth. My preference is to retain the very clean CLI that aider has currently. I use terminator to manage multiple windows and sub window and often have aider running in different aiders running in different projects (the big plus of terminator over tmux etc is I can alter the text size of each window which is great for having automated tests and log following etc)... so for this reason i'm happy for a simple linear workflow within aider...
I'm curious about the detail of what is proposed but I've notice lots of regressions in CE with loss of formatting etc that it would be great to resolve
@dwash96, is there a config setting to turn off the new TUI experience? In the integrated VSCode terminal, the new UI is not behaving nicely (no prompt in architect mode, formatting all over the place).
aider/coders/architect_coder.py:17: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited
if not self.auto_accept_architect and not self.io.confirm_ask("Edit the files?"):
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
I will debug more and file bugs but I was wondering if there is a feature flag that allows me to turn this off for now. Ty!
Somewhat similar warning, I started up a new session on HEAD, and got:
```
You can skip this check with --no-gitignore
/Users/pez/Library/Python/3.12/lib/python/site-packages/aider/main.py:194: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited
if not io.confirm_ask(f"Add {', '.join(patterns_to_add)} to .gitignore (recommended)?"):
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
I'm totally blind and use a screen reader. Simplicity (disabling pretty, fancy_input, etc.) is key here – please, at least for accessibility's sake, make any fancy terminal UIs optional.
Reacted by Robert Lieback, Dustin Washington, Chris Nestrud and bdutta
A few of these concerns should be alleviated with 0.88.5, added fixes for the /test command
As for formatting, the current interface is not what I have in mind at all for a TUI experience. The current interface is a compromise that allows the system to work with asynchronicity at all which is necessary to have wholly separate (as opposed to alternating) input and output buffers. Separating the input and output buffers allow for multiple styles of interface (a linear mode like you all are suggesting here, what it is now, and a full TUI mode for the competitive aesthetic that I'm interested in) to coexist and even more interesting things like remotely managing aider's process IO with an embedded web server which they do very clunk-ily in aider-desk by connecting to the stdin/stdout of a shell
@codeofdusk
Out of curiosity, how does a screen reader read a terminal for streaming programs? Are you simply disabling streaming? I'm kind of capped out of working on this this weekend, but I can add a "linear_output" mode next week that will emulate strict alternation between an input stage and output stage if that would work with the set up you use
Out of curiosity, how does a screen reader read a terminal for streaming programs?
On Windows, the terminal sends accessibility events that notify the attached screen reader that the text buffer changed, then the screen reader takes a diff and reads "new" text with some heuristics (to filter out things like typed characters, which are handled differently). Stock aider works well (I haven't yet used CE), as long as pretty and fancy-input are set to false.
Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you
Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you
@dwash96 I love the --linear-output flag. The rich output was messing up /test pytest outputs. Ty!
Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you
@dwash96 giving this a try. linear-output definitely helps, but the output is a little noisy ("processing..." after every command). How do I get an aider-like UI without extraneous output? My .aider.conf.yml:
Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you
@dwash96 giving this a try. linear-output definitely helps, but the output is a little noisy ("processing..." after every command). How do I get an aider-like UI without extraneous output? My .aider.conf.yml:
Activity
Netzvamp commented on Oct 22, 2025
I don't think this is necessary. The other coders are prettier, but in some of them you can't use normal terminal scroll or it's a pain to copy code from the terminal. And many use aider in very small terminals in vscode/pycharm, where every line is valuable and shouldn't be wasted with a fancy border around the code or something like that. There is no need for elements that wast space in the terminal, sometimes less is more. I like the distraction free aider UI as it is.
There are far more needed features:
It's a pain to restart aider, when the chat context matters for future steps. I know, you could tell aider to store a plan into a file, but that feels unnecessary and you may loose nuances.
Sometimes i generate a temporary plan/design into a markdown file and i don't like to add this temp file into the repo, but i have to so that aider can write into it.
But thank you for your afford to keep our favorite coder alive 👍
xRebellion commented on Oct 23, 2025
I also personally think aider's UI is fine as it is right now. I've ran around here and there trying out TUI coding agents, but Aider's simplicity is honestly what makes me keep coming back to it.
dwash96 commented on Oct 23, 2025
Yeah this is fair. I see a world where the TUI mode is just like the GUI mode, definitely optional but that's probably me just really liking Gemini cli's interface. I do see how session support for basic resumability and what y'all are describing for a plan -> apply workflow are more helpful though. Thank you for the feedback
avneeshs1 commented on Oct 27, 2025
@dwash96, is there a config setting to turn off the new TUI experience? In the integrated VSCode terminal, the new UI is not behaving nicely (no prompt in architect mode, formatting all over the place).
aider/coders/architect_coder.py:17: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited if not self.auto_accept_architect and not self.io.confirm_ask("Edit the files?"): RuntimeWarning: Enable tracemalloc to get the object allocation tracebackI will debug more and file bugs but I was wondering if there is a feature flag that allows me to turn this off for now. Ty!
Address Comment:
avneeshs1 commented on Oct 29, 2025
@dwash96 thanks for the commit. Unfortunately, I am still having problems (and a few more):
architect multi> `last_error` should be displayed in red. Aider v0.88.2 Main model: gpt-5 with architect edit format, reasoning high Editor model: gpt-5 with editor-diff edit format Weak model: gpt-5-nano Git repo: ../macro/.git/worktrees/macro-PMSAX-72.ds with 676 files Repo-map: using 4096 tokens, files refresh MCP servers configured: dagster-docs-mcp Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Change required Make the status pane that displays last_error render its text in red. Where to change In com/cat/utils/scripts/overrides.py inside build_view(), find the status pane initialization: - Current: status_md = pn.pane.Markdown(model.last_error, width=600) - Update: Add a styles dict setting the color to red: status_md = pn.pane.Markdown(model.last_error, width=600, styles={"color": "red"}) Why This ensures whatever string is assigned to last_error is rendered in red consistently. The existing watcher that updates status_md.object will continue to work and the style persists across updates. Optional (if you want red only for errors) If later you decide to color only when it’s an error (and use a neutral color for info messages), change the watcher to also set styles conditionally based on e.new (e.g., if "failed", "error" in message), but that’s not required for this request. Tokens: 110k sent, 202 received. Cost: $0.14 message, $0.16 session. Edit the files? (Y)es/(N)o [Yes]: y [10/29/25 17:23:38] INFO Processing request of type ListToolsRequest server.py:674 com/cat/utils/scripts/overrides.py ````python <<<<<<< SEARCH status_md = pn.pane.Markdown(model.last_error, width=600) ======= status_md = pn.pane.Markdown(model.last_error, width=600, styles={"color": "red"}) >>>>>>> REPLACE Tokens: 108k sent, 61 received. Cost: $0.14 message, $0.29 session. Applied edit to com/cat/utils/scripts/overrides.py Commit c3bd4a5 style: render last_error status text in red in status pane You can use /undo to undo and discard each aider commit. Aider v0.88.2 Main model: gpt-5 with architect edit format, reasoning high Editor model: gpt-5 with editor-diff edit format Weak model: gpt-5-nano Git repo: ../macro/.git/worktrees/macro-PMSAX-72.ds with 676 files Repo-map: using 4096 tokens, files refresh MCP servers configured: dagster-docs-mcp Restored previous conversation history. Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── I see the change is in place: last_error is rendered in red via styles={"color": "red"}. If you want more than fixed red, confirm and I’ll guide you to: - Conditional coloring: red for errors, green for success, neutral/grey otherwise. - Replace the current watcher with a handler that updates both object and styles based on the message content (e.g., contains "error"/"failed" → red; "inserted"/"transform applied" → green; empty → grey). - Initialize status_md with the same style function so it’s correct on load. - Optional: auto-clear non-error messages after a short delay. - In the same handler, if the message is a success/info, schedule a pn.state.add_periodic_callback to clear model.last_error after N seconds (and stop the callback). Say “yes” if you want this, and I’ll provide precise steps. Edit the files? (Y)es/(N)o [Yes]: ERROR:asyncio:an error occurred during closing of asynchronous generator <async_generator object stdio_client at 0xffff73d5d000> asyncgen: <async_generator object stdio_client at 0xffff73d5d000> + Exception Group Traceback (most recent call last): | File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 781, in __aexit__ | raise BaseExceptionGroup( | BaseExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) +-+---------------- 1 ---------------- | Traceback (most recent call last): | File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/mcp/client/stdio/__init__.py", line 189, in stdio_client | yield read_stream, write_stream | GeneratorExit +------------------------------------ During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/mcp/client/stdio/__init__.py", line 183, in stdio_client anyio.create_task_group() as tg, ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 787, in __aexit__ if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 459, in __exit__ raise RuntimeError( RuntimeError: Attempted to exit cancel scope in a different task than it was entered in # Uncaught AssertionError in application.py line 651 Aider version: 0.88.2 Python version: 3.12.10 Platform: Linux-6.1.147-172.266.amzn2023.aarch64-aarch64-with-glibc2.34 Python implementation: CPython Virtual environment: Yes OS: Linux 6.1.147-172.266.amzn2023.aarch64 (64bit) Git version: git version 2.50.1 An uncaught exception occurred: Traceback (most recent call last): File "aider-ce", line 10, in <module> sys.exit(main()) ^^^^^^ File "main.py", line 474, in main return asyncio.run(main_async(argv, input, output, force_git_root, return_coder)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "runners.py", line 195, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "base_events.py", line 691, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "main.py", line 1212, in main_async await coder.run() File "base_coder.py", line 1065, in run return await self._run_patched(with_message, preproc) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "base_coder.py", line 1132, in _run_patched await processing_task File "base_coder.py", line 1172, in _processing_logic await self.run_one(user_message, preproc) File "base_coder.py", line 1228, in run_one async for _ in self.send_message(message): File "base_coder.py", line 1994, in send_message if await self.reply_completed(): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "architect_coder.py", line 17, in reply_completed if not self.auto_accept_architect and not await self.io.confirm_ask("Edit the files?"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "io.py", line 84, in wrapper return await func(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "io.py", line 1022, in confirm_ask return await asyncio.create_task(self._confirm_ask(*args, **kwargs)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "io.py", line 1128, in _confirm_ask res = await prompt_task ^^^^^^^^^^^^^^^^^ File "prompt.py", line 1252, in prompt_async return await self.app.run_async( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "application.py", line 651, in run_async assert not self._is_running, "Application is already running." ^^^^^^^^^^^^^^^^^^^^ AssertionError: Application is already running. Please consider reporting this bug to help improve aider!ErichBSchulz commented on Oct 30, 2025
my 2c, for what it's worth. My preference is to retain the very clean CLI that aider has currently. I use terminator to manage multiple windows and sub window and often have aider running in different aiders running in different projects (the big plus of terminator over tmux etc is I can alter the text size of each window which is great for having automated tests and log following etc)... so for this reason i'm happy for a simple linear workflow within aider...
I'm curious about the detail of what is proposed but I've notice lots of regressions in CE with loss of formatting etc that it would be great to resolve
Wheest commented on Oct 30, 2025
Somewhat similar warning, I started up a new session on HEAD, and got:
```
You can skip this check with --no-gitignore
/Users/pez/Library/Python/3.12/lib/python/site-packages/aider/main.py:194: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited
if not io.confirm_ask(f"Add {', '.join(patterns_to_add)} to .gitignore (recommended)?"):
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
codeofdusk commented on Nov 1, 2025
I'm totally blind and use a screen reader. Simplicity (disabling pretty, fancy_input, etc.) is key here – please, at least for accessibility's sake, make any fancy terminal UIs optional.
Refactor primary runtime loop to improve Aider-CE's state machine and…
#48: Fix /test command and make both /test and /run command outputs p…
dwash96 commented on Nov 3, 2025
A few of these concerns should be alleviated with 0.88.5, added fixes for the /test command
As for formatting, the current interface is not what I have in mind at all for a TUI experience. The current interface is a compromise that allows the system to work with asynchronicity at all which is necessary to have wholly separate (as opposed to alternating) input and output buffers. Separating the input and output buffers allow for multiple styles of interface (a linear mode like you all are suggesting here, what it is now, and a full TUI mode for the competitive aesthetic that I'm interested in) to coexist and even more interesting things like remotely managing aider's process IO with an embedded web server which they do very clunk-ily in aider-desk by connecting to the stdin/stdout of a shell
@codeofdusk
Out of curiosity, how does a screen reader read a terminal for streaming programs? Are you simply disabling streaming? I'm kind of capped out of working on this this weekend, but I can add a "linear_output" mode next week that will emulate strict alternation between an input stage and output stage if that would work with the set up you use
codeofdusk commented on Nov 3, 2025
On Windows, the terminal sends accessibility events that notify the attached screen reader that the text buffer changed, then the screen reader takes a diff and reads "new" text with some heuristics (to filter out things like typed characters, which are handled differently). Stock aider works well (I haven't yet used CE), as long as pretty and fancy-input are set to false.
#48: Add linear_output mode because it is theorhetically more accessible
dwash96 commented on Nov 3, 2025
Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you
dwash96 commented on Nov 4, 2025
@Netzvamp
You will be happy to know, I'm adding session commands (/save-session, /load-session, /list-sessions) in 0.88.6
avneeshs1 commented on Nov 14, 2025
@dwash96 I love the --linear-output flag. The rich output was messing up /test pytest outputs. Ty!
dwash96 commented on Dec 13, 2025
Big shout out to @1broseidon for getting us much further along the path to an industry level TUI:
The work is on-going but very nice to see it chugging along
dwash96 commented on Dec 15, 2025
Stunning success, v0.90.0 finishes this, everything else is maintenance
codeofdusk commented on Jan 5, 2026
@dwash96 giving this a try. linear-output definitely helps, but the output is a little noisy ("processing..." after every command). How do I get an aider-like UI without extraneous output? My .aider.conf.yml:
dwash96 commented on Jan 9, 2026
Sorry, I just saw this one, I added:
d8b231f
To not show the "Processing" and "Finished" messages when pretty is false