It's been a little while since my last agent-shell update, so let's go through the latest highlights as of v0.55.
What's agent-shell?
agent-shell is a native Emacs mode to interact with AI agents powered by ACP (Agent Client Protocol).
Picking up where I left off
If you noticed slower project activity in April, this is why. I'm getting better at the new 24-hour job, so I've resumed working on agent-shell.
I'm still chipping away at the backlog that built up while I was away, but if there's anything in particular you'd like me to look at, feel free to ping.
Anthropic, Google, and why ACP matters
With Anthropic's SDK subscription support changing, Google's Gemini CLI deprecation, and Antigravity's unclear support for the Agent Client Protocol (ACP), vendor-neutral tools matter more than ever.
Luckily, agent-shell is built on ACP, which sidesteps the problem. When a vendor changes course, you can swap providers and keep using your preferred tool. No need to reshape that hard-earned muscle memory.
On that note, the list of agents supported by agent-shell continues to grow.
Supported agents
Here's a list of the latest agents now supported by agent-shell.

- Auggie
- Claude
- Cline
- CodeBuddy (new by @illidan127)
- Codex
- Cursor
- Factory Droid
- Gemini CLI
- GitHub Copilot CLI
- Goose
- Hermes (new by @yitang)
- Kimi Code (new by @nicolaisingh)
- Kiro
- Mistral Vibe
- OpenCode
- Pi
- Qwen Code
agent-shell needs your support
Speaking of vendor-neutral tools being more important than ever, there are a couple of ways to help keep agent-shell going. Some cost money, others just a click. All are appreciated ;)
agent-shell has been attracting quite a few users. It's nice to hear folks are using agent-shell on a daily basis. They are often relieved agent-shell exists as an alternative to AI-tools commonly mandated at work. Those tools have well-funded engineering teams behind them, while agent-shell is just me, an indie dev ;) Time spent on agent-shell is time away from work that pays the bills, so if it's useful to you, please consider sponsoring the project.
Every individual sponsorship genuinely helps keep the project going. And if your employer benefits from your agent-shell use, they're typically in a position to contribute at a scale individuals can't, so nudge them to chip in too.
Hey, I'm looking at you, folks at Google, GitHub, GitLab, NVIDIA, Oracle, Red Hat, Yelp, Venmo, ARM, Spotify, Augment Code, Hinge, Mercury, Nubank, Veeva… Some of you are using agent-shell. Nudge your employer ;)
GitHub stars for Anthropic credit
Anthropic offers 6 months of free Claude Max 20x for qualifying open-source projects with at least 5,000+ GitHub stars. Starring agent-shell costs nothing and can save me some money. We're only a 5th of the way there ;) so if you don't mind a couple of clicks, the project can really use another GitHub star.
Speaking of GitHub stars, agent-shell is now my most popular Emacs package, recently overtaking chatgpt-shell.
New markdown renderer
agent-shell now ships with a brand new, more performant inline markdown renderer. This is the biggest internal change in some time. Enabled by default via agent-shell-markdown-render-function (moving away from the overlay-based renderer in shell-maker).
Access/navigate table content
Table content is now accessible. Point can land on any cell, which wasn't possible with the previous overlay implementation. In addition, tables are now also navigable: TAB and S-TAB move between cells.

Improved source block support (enabled by default)
Source-block syntax highlighting is now on by default. The per-snippet copy button is now keyboard-accessible too (previously mouse-click only, due to the overlay implementation).

New blockquotes support
Blockquotes now render in both shell and viewport. More importantly, you can select text in either a viewport page (or the shell itself), press r (for reply) and the selection becomes a blockquote in a fresh prompt.
Viewport

Shell

Session restoration
Session restoration got a meaningful overhaul (#605 by @nhojb), now exposed via agent-shell-session-restore-verbosity, with four levels:
minimal(default): title only, so restore is fast and quiet (needssession/resumesupport).last: render the last prompt turn (needssession/loadsupport).first-last: render the first and last prompt turns (needssession/loadsupport).full: replay the whole conversation (needssession/loadsupport).
Feature availability is agent-specific, requiring either session/resume or session/load request support. agent-shell degrades as needed, ultimately falling back to creating a new session.
Note that anything but minimal verbosity is fairly new, so please report bugs or rough edges.
Relatedly, agent-shell-session-strategy now defaults to 'prompt, and 'new-deferred has been retired.
Session forking
You can now fork the current session, starting a new shell that shares the conversation history so far and diverges from there. Invoke via M-x agent-shell-fork.
Restart/reload session
You can now restart the current shell anew (drop history) via M-x agent-shell-restart or reload (keep history) via agent-shell-reload.
Downloads/Temp shells
The new agent-shell-new-downloads-shell and agent-shell-new-temp-shell commands create agents anchored at either ~/Downloads or a temp directory. Both are also reachable via C-u M-x agent-shell.

TRAMP support
acp.el #20 by @martenlienen landed support for ACP connections over TRAMP, now making it possible to drive remote agents from agent-shell. Pair it with agent-shell-tramp for the user-facing integration.
Viewport improvements
Viewport interaction (setq agent-shell-prefer-viewport-interaction t) continues to be my primary way to interact with agents. It is focused (see only the latest interaction), fast (single-key bindings: y = yes, c = continue, m = more…), and offers a richer editing experience (dedicated prompt-crafting buffer).
The viewport is just a viewport to shell content. You can have your cake and eat it too, by jumping to the related shell buffer if needed.
Queueing
From a viewport, you can press r to reply to the latest agent response. In the past, you could only reply to idle agents. You can now press r to reply to busy agents too, automatically queuing requests on submission.
List editing mode
A new (basic) agent-shell-list-edit-mode lets you edit list-style content inside the viewport.

Improved buffer selection
Some commands prompt you to pick one of your active shell buffers (e.g. M-x agent-shell-send-region-to). The picker now shows extra context for each buffer to help you choose.

The same mechanism is now used by the new M-x agent-shell-switch-buffer command. More on the underlying API later.
Improved folding
Folding got smarter (#608 by @codeluggage):
M-x agent-shell-ui-toggle-fragmenttoggles the fragment at or near point (DWIM).M-x agent-shell-ui-toggle-all-fragmentscycles globally between all-expanded and all-collapsed.
Together they replace the previous agent-shell-ui-toggle-fragment-at-point, which is now an internal primitive.
c joins the viewport reply gang
You can now press c from a viewport to quickly send a "continue" request, joining the rest of the single-key reply shortcuts:
c: replies "continue" (new)y: replies "yes"m: replies "more"a: replies "again"1…9: replies with the corresponding numbered choicer: opens the reply compose bufferR: same asr, with the agent response quoted

More compact status rendering
Tool call status is now rendered as a compact icon-based label by default (agent-shell--inverse-icon-status-kind-label). agent-shell-styles.el ships several alternatives, picked via agent-shell-status-kind-label-function.

To get the previous word-based label back:
(setq agent-shell-status-kind-label-function
#'agent-shell--inverse-label-status-kind-label)
Codex defaults
You can now set a default model and session mode for Codex via agent-shell-openai-default-model-id and agent-shell-openai-default-session-mode-id (#405 by @robjgray). Both must match an ID from Codex's "Available models" / "Available modes" listings.

Emacs 31 fixes
Headers had a few rendering hiccups on Emacs 31. These are now fixed (#588 and #590 by @nhojb, #463 by @ftlio). Warnings from deprecated when-let usage were also cleared.
Wayland clipboard support
wl-paste is now a supported clipboard handler for pasting images on Wayland (#461 by @martenlienen).
Windows clipboard support
Similarly, pasting clipboard images now works on Windows via PowerShell (#572 by @repelliuss).
The graphical header got minor tweaks here and there. For example, thought level is now displayed in the header. It can be changed via M-x agent-shell-viewport-set-session-thought-level as well as menus (#601 by @martenlienen).



Session config options
agent-shell now supports ACP session config options (#553 by @greggroth and #613 by @catern). Bind C-c C-s (or call agent-shell-set-session-config-option) to pick from the options the agent advertises. Broadcasted as config-option-update and available externally via agent-shell-subscribe-to.
Interrupt confirmation
You can now skip interrupt confirmations by unsetting agent-shell-confirm-interrupt (#424 by @emil-e).
Public functions
Resume sessions by ID
You can now resume an existing session by its ID via M-x agent-shell-resume-session (#332). Primarily useful for external integrations.
Outgoing request decorator
You can now use agent-shell-outgoing-request-decorator to tag or transform outgoing requests.
Subscribe to idle events
agent-shell-subscribe-to now broadcasts idle events (#509 by @arthurgleckler).
Getting shell buffers
agent-shell-shell-buffer returns the underlying shell buffer for the current context.
Last vs interaction at point
agent-shell-goto-last-interaction jumps to the latest prompt/response pair, while agent-shell-interaction-at-point returns the interaction at point as data.
Shell status
agent-shell-status returns 'busy, 'blocked, or 'ready status for any shell buffer.
Session title
The agent-supplied session title is now exposed via the session-title-changed event (delivered via agent-shell-subscribe-to) (#559 by @smagnuso). Can be handy for buffer names, bookmarks, or recent listings.
New third-party packages
The agent-shell family of third-party packages keeps growing. Recent additions:
- agent-shell-knockknock: Notifications for
agent-shellvia knockknock.el. - agent-shell-notifications: Desktop notifications for
agent-shellevents. - agent-shell-hud: Real-time
agent-shellstatus overlay via a floating dashboard. - agent-shell-pet: Codex-like pets that broadcast agent-shell session states.
- agent-shell-tramp: Tramp integration for
agent-shell. - agent-circus: Run AI coding agents in sandboxed Docker containers.
Pull requests
Thank you to all contributors for these improvements!
- #308: Fix heartbeat nil value crash in timer and busy indicator (@ElleNajt)
- #340: Add documentation about the OAuth Anthropic authentication (@chemtov)
- #397: Add detailed context usage indicator mode (@emil-e)
- #398: Expose outgoing-request-decorator as a defcustom (@emil-e)
- #405: Codex defaults for session mode and model (@robjgray)
- #408: Use diff-command for diffing (@timfel)
- #413: Track and manage diff buffers for each permission request (@emil-e)
- #418: Add defvar for agent-shell-mode-hook + test (@emil-e)
- #420: Replace all references to "Claude Code Agent" with "Claude Agent" (@jinnovation)
- #421: Add agent-shell-clear (@Makesesama)
- #424: Add agent-shell-confirm-interrupt option (@emil-e)
- #425: README: Update all references to Claude Code (@jinnovation)
- #429: Viewport attachment fixes (@nhojb)
- #438: Fix for structured input from toolCall.rawInput.plan (@timfel)
- #442: Add related project
agent-circusto README.org (@rpoisel) - #445: Use project-name instead of default-directory in header (@bcc32)
- #446: Droid: use native acp client and support default model and mode (@kohnish)
- #450: Fix restart using wrong default-directory (@zackattackz)
- #453: Ensure that viewport compiles (@martenlienen)
- #457: Prefer cache directory over tmp for caching (@martenlienen)
- #460: Unhandled method returns an error, unblocking client (@0x6362)
- #461: Add wl-paste as a Wayland image handler (@martenlienen)
- #463: Fix header text invisible when font-get :size returns 0 (@ftlio)
- #469: Do not create a file if no image in Wayland clipboard (@martenlienen)
- #473: Caching project files completions for improved performance (@Gleek)
- #477: Handle non-text content in user_message_chunk during session load (@Gleek)
- #483: Add CodeBuddy agent support (@illidan127)
- #489: Snapshot session strategy in any case (@timfel)
- #492: Update claude-agent-acp repository (@Gleek)
- #498: Normalize missing MCP transport collection fields for ACP compatibility (@CsBigDataHub)
- #503: Add agent-shell-macext to related projects (@cxa)
- #509: Add
agent-shell-idle-alert-functions(@arthurgleckler) - #513: Quote reply to the complete response with
R(@martenlienen) - #515: Make detection of binary files more robust (@martenlienen)
- #523: Add agent-shell-org-transcript to Related projects (@lllShamanlll)
- #528: Add support for Kimi Code CLI using ACP (@nicolaisingh)
- #529: Sort the session list based on recency (@smagnuso)
- #530: Add simple blinking circle as busy indicator (@rudolf-adamkovic)
- #532: Fix removing queued messages (@Gleek)
- #536: Add programmatic query API: agent-shell-query and agent-shell-shell-buffer (@eddof13)
- #539: Add ob-agent-shell to related projects in readme (@eddof13)
- #545: Keep buffer name on agent-shell-reload and -restart (@timfel)
- #550: Add agent-recall to related projects (@Marx-A00)
- #551: Avoid gitignore update for external data dirs (@Silex)
- #552: Use helper function from shell-maker rather than eob (@smagnuso)
- #553: Add ACP session config options support (@greggroth)
- #554: Fix error when cancelling session selection prompt (@Gleek)
- #555: Add some niceties useful for
agent-shell-list(@vermiculus) - #559: Expose topic in agent-shell (@smagnuso)
- #561: Update Pi coding agent logo to look more official (@jeff-phil)
- #565: Enable @ and / completion when reading queued prompts (@Gleek)
- #571: Fix unkillable buffer after major-mode change (@Scott-Guest)
- #572: Add clipboard image support for Windows (@repelliuss)
- #574: Add agent-shell-pet link to README (@lgmoneda)
- #582: Add a few additional forward declarations (@tychoish)
- #583: Add Hermes Agent support (@yitang)
- #588: Fix header foreground color (emacs 31) (@nhojb)
- #589: Only trim response region when region is active (@martenlienen)
- #590: Fix context-limit header color (emacs-31) (@nhojb)
- #595: Fix
/completion regression in viewport buffers (@Gleek) - #600: Do not emit permission-request for auto-handled permissions (@Gleek)
- #601: Expose thought level (reasoning effort) in header, mode line and keymaps (@martenlienen)
- #602: Update README with Opencode and Ollama setup instructions (@dvictori)
- #605: Add
agent-shell-restore-contextdefcustom (@nhojb) - #608: Toggle folding for everything & comfortably fold at point (@codeluggage)
- #609: Prevent accidental auto-scrolling in viewport buffers on tool calls (@martenlienen)
- #611: Fix
agent-shell-hermes-acp-command(@TamsynUlthara) - #613: Improve completion for set-session-config-option (@catern)
- #618: Fix header not showing session mode name (@deftsp)
- #621: Reindent Elisp files (@bcc32)
- #623: Add agent-shell-hud to related packages (@nohzafk)
- #625: Fix source-block face background not rendering when theme loads after package (@phairoh)
- #627: Hermes: add default-session-mode-id to match other agents (@yitang)
- #629: Write
.agent-shell/to.git/info/excludeinstead of.gitignore(@phairoh) - #632: Render tool call parameters for non-standard tools like MCP calls (@martenlienen)
- #633: Add GitHub Actions workflow for ERT tests (@phairoh)
- #634: Update art generated by
agent-shell-hermes--ascii-art(@TamsynUlthara) - #639: Preserve window position when restarting (@Gleek)
Bug fixes
- #202: Header icon is double the expected size
- #278: Heartbeat causes high CPU usage with many agent buffers
- #366:
.agent-shell/directory at risk when switching git branches - #400:
agent-shell-viewport-reply-1errors with "Text is read-only" - #401: Garbled characters output when using non-English languages
- #412: Diff buffer management is messy
- #414:
agent-shell-mode-hooktiming makes subscribing to events difficult - #417: Unhandled notifications with kiro
- #426: Starting conversation before agent has initialized leaves "dangling" text
- #431: Heartbeat timer keeps running after failed/abandoned authentication in OpenAI
- #435:
xclipclipboard handler silently saves text as PNG in terminal mode - #441: Background agent notifications treated as stale after
session/promptresponse - #443:
image-type: Invalid image type'svgon calling agent-shell - #455: agent-shell enters frozen/hanging state when receiving unknown notifications
- #462: Header text invisible when
font-get :sizereturns 0 - #465: Session load crashes on non-text user message chunks (e.g. images)
- #466:
agent-shell-diff-accept-all/-reject-allnow focus the originating shell - #468:
wl-paste-image-handlerbreaks pasting text - #481: History input rolls back in
insertediting mode while pressing up/down arrows - #485: Shells created in other workspaces no longer display
- #493: Tables rendered in agent-shell break cursor (point) navigation
- #533: Can't install agent-shell from MELPA
- #548: Copied highlighted text from agent output includes trailing backtick
- #563: "Cannot modify map in-place" when starting agents
- #577:
agent-shell-get-configdoes not work in anagent-shell-command-prefixfunction - #587: Long region preview's "Expand…" button is sent literally to the agent
- #617: OpenCode: consent prompt shows empty input when
request_permissionarrives beforetool_call_updatepopulatesrawInput
Lots of polish
Beyond what's showcased, I've poured much love and effort into polishing the agent-shell experience. Interested in the nitty-gritty? Have a look through my regular commits.
Make the work sustainable
If agent-shell is useful to you, please consider sponsoring the project. I'm now back to working on agent-shell daily.
LLM tokens aren't free, and neither is the time dedicated to building this stuff (especially as an indie dev). I also have bills to pay ;)
Unless I can make this work sustainable, I will have to shift my focus to work on something else that is.
powered by LMNO.lol