Add Emacs as a channel. Opens an interactive chat buffer and org-mode integration so you can talk to NanoClaw from within Emacs (Doom, Spacemacs, or vanilla). Uses a local HTTP bridge — no bot token or external service needed.
62
72%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.claude/skills/add-emacs/SKILL.mdThis skill adds Emacs support to NanoClaw, then walks through interactive setup. Works with Doom Emacs, Spacemacs, and vanilla Emacs 27.1+.
C-c n c / SPC N c), ask about a function or error without leaving Emacsnanoclaw-org-send; the response appears as a child heading inline in your org fileCheck if src/channels/emacs.ts exists:
test -f src/channels/emacs.ts && echo "already applied" || echo "not applied"If it exists, skip to Phase 3 (Setup). The code changes are already in place.
git remote -vIf an upstream remote pointing to https://github.com/qwibitai/nanoclaw.git is missing,
add it:
git remote add upstream https://github.com/qwibitai/nanoclaw.gitgit fetch upstream skill/emacs
git merge upstream/skill/emacsIf there are merge conflicts on package-lock.json, resolve them by accepting the incoming
version and continuing:
git checkout --theirs package-lock.json
git add package-lock.json
git merge --continueFor any other conflict, read the conflicted file and reconcile both sides manually.
This adds:
src/channels/emacs.ts — EmacsBridgeChannel HTTP server (port 8766)src/channels/emacs.test.ts — unit testsemacs/nanoclaw.el — Emacs Lisp package (nanoclaw-chat, nanoclaw-org-send)import './emacs.js' appended to src/channels/index.tsIf the merge reports conflicts, resolve them by reading the conflicted files and understanding the intent of both sides.
npm run build
npx vitest run src/channels/emacs.test.tsBuild must be clean and tests must pass before proceeding.
The channel works out of the box with defaults. Add to .env only if you need non-defaults:
EMACS_CHANNEL_PORT=8766 # default — change if 8766 is already in use
EMACS_AUTH_TOKEN=<random> # optional — locks the endpoint to Emacs onlyIf you change or add values, sync to the container environment:
mkdir -p data/env && cp .env data/env/envThe nanoclaw.el package requires only Emacs 27.1+ built-in libraries (url, json, org) — no package manager setup needed.
AskUserQuestion: Which Emacs distribution are you using?
Doom Emacs — add to ~/.config/doom/config.el (or ~/.doom.d/config.el):
;; NanoClaw — personal AI assistant channel
(load (expand-file-name "~/src/nanoclaw/emacs/nanoclaw.el"))
(map! :leader
:prefix ("N" . "NanoClaw")
:desc "Chat buffer" "c" #'nanoclaw-chat
:desc "Send org" "o" #'nanoclaw-org-send)Then reload: M-x doom/reload
Spacemacs — add to dotspacemacs/user-config in ~/.spacemacs:
;; NanoClaw — personal AI assistant channel
(load-file "~/src/nanoclaw/emacs/nanoclaw.el")
(spacemacs/set-leader-keys "aNc" #'nanoclaw-chat)
(spacemacs/set-leader-keys "aNo" #'nanoclaw-org-send)Then reload: M-x dotspacemacs/sync-configuration-layers or restart Emacs.
Vanilla Emacs — add to ~/.emacs.d/init.el (or ~/.emacs):
;; NanoClaw — personal AI assistant channel
(load-file "~/src/nanoclaw/emacs/nanoclaw.el")
(global-set-key (kbd "C-c n c") #'nanoclaw-chat)
(global-set-key (kbd "C-c n o") #'nanoclaw-org-send)Then reload: M-x eval-buffer or restart Emacs.
If EMACS_AUTH_TOKEN was set, also add (any distribution):
(setq nanoclaw-auth-token "<your-token>")If EMACS_CHANNEL_PORT was changed from the default, also add:
(setq nanoclaw-port <your-port>)npm run build
launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS
# Linux: systemctl --user restart nanoclawcurl -s "http://localhost:8766/api/messages?since=0"Expected: {"messages":[]}
If you set EMACS_AUTH_TOKEN:
curl -s -H "Authorization: Bearer <token>" "http://localhost:8766/api/messages?since=0"Tell the user:
- Open the chat buffer with your keybinding (
SPC N c,SPC a N c, orC-c n c)- Type a message and press
RET- A response from Andy should appear within a few seconds
For org-mode: open any
.orgfile, position the cursor on a heading, and useSPC N o/SPC a N o/C-c n o
tail -f logs/nanoclaw.logLook for Emacs channel listening at startup and Emacs message received when a message is sent.
Error: listen EADDRINUSE: address already in use :::8766Either a stale NanoClaw process is running, or 8766 is taken by another app.
Find and kill the stale process:
lsof -ti :8766 | xargs kill -9Or change the port in .env (EMACS_CHANNEL_PORT=8767) and update nanoclaw-port in Emacs config.
Check:
launchctl list | grep nanoclaw (macOS) or systemctl --user status nanoclaw (Linux)sqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid = 'emacs:default'"tail -50 logs/nanoclaw.logIf the group is not registered, it will be created automatically on the next NanoClaw restart.
Verify the token in Emacs matches .env:
;; M-x describe-variable RET nanoclaw-auth-token RETMust exactly match EMACS_AUTH_TOKEN in .env.
Check the path is correct:
ls ~/src/nanoclaw/emacs/nanoclaw.elIf NanoClaw is cloned elsewhere, update the load/load-file path in your Emacs config.
If running npm run dev while the service is active:
# macOS:
launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist
npm run dev
# When done testing:
launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist
# Linux:
# systemctl --user stop nanoclaw
# npm run dev
# systemctl --user start nanoclawThe Emacs bridge converts markdown → org-mode automatically. Agents should output standard markdown — not org-mode syntax. The conversion handles:
| Markdown | Org-mode |
|---|---|
**bold** | *bold* |
*italic* | /italic/ |
~~text~~ | +text+ |
`code` | ~code~ |
```lang | #+begin_src lang |
If an agent outputs org-mode directly, bold/italic/etc. will be double-converted and render incorrectly.
To remove the Emacs channel:
src/channels/emacs.ts, src/channels/emacs.test.ts, and emacs/nanoclaw.elimport './emacs.js' from src/channels/index.tssqlite3 store/messages.db "DELETE FROM registered_groups WHERE jid = 'emacs:default'"EMACS_CHANNEL_PORT and EMACS_AUTH_TOKEN from .env if setnpm run build && launchctl kickstart -k gui/$(id -u)/com.nanoclaw (macOS) or npm run build && systemctl --user restart nanoclaw (Linux)7454673
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.