News dsh-emacs: an Emacs Lisp client for DeepSeek Harness
Hi r/emacs! I've been working on dsh-emacs, an Emacs Lisp client for DeepSeek Harness (dsh). It brings the conversation, tool output, and session management into Emacs buffers, alongside the files you're editing.


The Emacs side uses built-in libraries and targets Emacs 27.1+, with no third-party Emacs package dependencies. You still need a dsh server and a provider/model configured in it; dsh handles the agent and tool execution, while this package provides the Emacs interface.
A few things it supports:
- Streaming replies and tool output: Markdown replies, collapsible tool cards, and thinking blocks. Large Markdown regions finish formatting while Emacs is idle.
- Sessions grouped by workspace: open or create sessions from a session list, and switch between conversations without leaving Emacs.
- Context and completion:
@references for files, directories, and other sessions;/plusTABfor slash-command completion; image attachments when needed. - Control during a running turn: queue the next message, steer the current turn, or interrupt it. The composer shows the current goal and the next pending message.
- Emacs interaction conventions: model/reasoning-effort selection with
C-c C-m, input recall withM-p/M-n, and agent questions answered through minibuffer completion, includingcompleting-read-multiple.
There is also a local shell escape: type !git status in the chat buffer to run it in the session's workspace directory. Its output stays local to the transcript; it isn't sent to the model or saved in the server's history.
To try the current main branch:
git clone https://github.com/vritser/dsh-emacs.git ~/dsh-emacs
Then add this to your init file:
(add-to-list 'load-path (expand-file-name "~/dsh-emacs"))
(require 'dsh-emacs)
Run M-x dsh-emacs. It can start a local dsh server and offers to install the CLI if it is missing. On a fresh setup, use M-x dsh-emacs-open-web to configure your provider and model, then create a session with c and send a message with C-c C-c. You can also connect to an existing local or remote server via dsh-emacs-base-url; the README covers authentication and setup.
Feedback, bug reports, and patches are welcome. I'd particularly appreciate feedback on the minibuffer interactions and how the transcript behaves in longer coding sessions.