Write to the Claude Code session that published a page, from the page itself. It reads your message, does the work (usually editing the page), and answers in the same place. Pro and Team.
- Turn it on at Settings → Account → Talk to your sessions, or ask your agent (
talk_settings). - Set up the computer once with sessionpipe, in a terminal on it:
It installs sessionpipe’s session hooks and pairs its daemon with your account, approved with your passkey (Touch ID or Face ID). From then on every Claude Code session on that computer takes your messages in place: nothing to start per session.npx -y sessionpipe@latest connect spacesheep.dev --mode auto - Talk. Open the page’s Co-shepherd drawer: while its session listens, the drawer opens on a Session tab. You see delivered ✓, then 👀 and what it is doing (“Editing…”, “Verifying on a phone”), then its reply.
What it costs the session: nothing. One small daemon per computer waits for your messages, checks your passkey’s signature on each, and hands it to the session it is for, which wakes once per message and never in between.
Without sessionpipe
A session can still listen on its own: Codex and other harnesses, or a computer that doesn’t run sessionpipe. Type /talk in Claude Code (spacesheep plugin), or say “listen for my spacesheep messages”. A session that has no talk_listen tool was started before the feature: reopen it with claude --resume <id> and ask again. The listener is a background shell that waits as long as it takes and ends only when a message arrives. (A Monitor would expire every 30 minutes, and every expiry is a turn.)
What listening needs: a session that can hold a background command — the curl loop on macOS, Linux or WSL, or Windows PowerShell. A harness with only a Monitor-style watch can open the listen link as a WebSocket instead. Chat apps with no shell (claude.ai, ChatGPT) can’t listen; for those, the Session tab offers “ask Co-shepherd instead”, which runs your message on spacesheep’s own agent.
Claude Code in auto mode refuses to start a listener on its own (“Unauthorized Persistence”): a background command that takes instructions from a web page is exactly what its classifier is there to stop. That is correct, so say yes once, in ~/.claude/settings.json. Narrow allow rules are settled before the classifier runs:
{
"permissions": {
"allow": [
"mcp__plugin_spacesheep_spacesheep__talk_listen",
"mcp__plugin_spacesheep_spacesheep__talk_reply",
"mcp__spacesheep__talk_listen",
"mcp__spacesheep__talk_reply",
"Bash(npx -y spacesheep@latest talk listen *)",
"Monitor(npx -y spacesheep@latest talk listen *)"
]
}
}
The first two are for the plugin, the next two for a server added with claude mcp add. Keep whichever matches your setup. Then start it yourself: type /talk. A session in auto mode runs the npx listener (the one the rules name) rather than the curl loop; the Monitor rule is for sessions on the older skill. Messages still arrive only from you, signed in on spacesheep.dev, and the session confirms anything destructive before doing it.
From a script (a nightly check, a cron job): send as the owner with your API key from Settings → API keys, and read the thread back for the reply. space is the page’s link or uuid; session_id is one that published it (GET /api/talk/thread?space=… lists them).
curl -sS https://spacesheep.dev/api/talk/send -H "Authorization: Bearer $SPACESHEEP_KEY" \
-H 'content-type: application/json' -d '{"space":"https://spacesheep.dev/@you/page","session_id":"…","text":"replace NONCE-A with NONCE-B"}'
curl -sS "https://spacesheep.dev/api/talk/thread?space=<uuid>&session=<id>" -H "Authorization: Bearer $SPACESHEEP_KEY"
Security: only the page’s owner can write, and only to a session that published it as them. The listen link is random, stored only as a hash, reads that one session’s messages and nothing else, expires in a day, and stops working the moment Talk is switched off.
talk_settings({ enabled?: boolean }) // read or switch the feature
talk_listen({ session_id }) // → waiter_command (sessionpipe), else once_command / npx_once_command / powershell_command / monitor_command
talk_reply({ session_id, text }) // answer in the Session tab
npx -y sessionpipe@latest control status // is this computer paired?