Generated Computers
Locals: an Apple Silicon engine that runs local LLMs up to 3x faster. A product of Generated Computers.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证The ManyClaws plugin and machine agent: the parts of ManyClaws that run on your own computers
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗ManyClaws shows every Claude Code session you have running, on every computer, on one web page and on your phone, and lets you reply to them from there.
This repository holds every part of it that runs on your own devices:
mod/): a Claude Code plugin. It reports each session to the ManyClaws server and does what your own devices ask of that session. It carries the agent, and the signed list of every file it was released with (mod/release.json).mod/agent/): a small background service, one per computer, which the plugin installs from its own folder when you ask from the page. It indexes that computer's Claude Code transcripts so past sessions can be read and searched, starts or resumes sessions when you ask from the page, and checks the plugin there against the release it carries.web/): what your browser and your phone run, as the server hands it out. It is where your account's key is made and kept, and where every device is approved, so it is published here with the rest, and what a server hands you can be held against it (see "Checking what you run").The server is not in this repository. It stores and forwards what your devices encrypted.
Everything a session says is end-to-end encrypted: on the computer it runs on, before it is sent, with your account's own key: made of random bytes on your first phone or browser, and handed from one of your devices to another, sealed, as you approve each. There is no passphrase. The server stores and forwards what it is given.
A plugin that has not been given your key sends nothing at all.
mod/hooks/seal.js is the whole of it, and its opening comment is the specification: what your key is drawn from, what a sealed value is, how a key is handed to a new device, and how a request from a phone or browser is signed and checked. In short:
Claude Code's plugin runtime has no crypto library, so every primitive (SHA-256, SHA-512, HMAC, HKDF, AES-256-GCM, Ed25519, SPAKE2, and the check of an SSH signature) is implemented in that one file in plain JavaScript. mod/agent/seal.mjs and web/seal.js are identical copies. (The page seals and signs with the browser's own WebCrypto, and keeps its keys where no script can read them back: web/keys.js.) The plain JavaScript is not written to run in constant time: that matters only to someone who can time code on your own computer.
What is known, and not hidden: a sealed value is not tied to the session or the place it was sealed for, so a server could show one sealed thing where another belongs, or leave things out; removing a device stops its orders and signs it out, and it takes starting afresh with a new key to shut it out of what is said from then on; and one key seals everything an account says.
mcf_…. MANYCLAWS_KEY in the environment takes the key written out, for a set-up with nobody there, and nothing else is a key.~/.manyclaws/agent.json has only a fingerprint of the two. Elsewhere they are in that file, which only you can read (--no-keychain keeps them there on a Mac too).The key reads what your sessions say. It cannot sign the list of your devices, so nothing that has only the key can ask anything of your computers; and the root, which can, is never on a computer, and on a phone or browser only behind its passkey.
| Path | What it is |
|---|---|
mod/.claude-plugin/plugin.json | The plugin's manifest: its version and its options (API token and key, filled in as the computer is connected; label; capabilities) |
mod/hooks/register.js | The plugin: reports the session, polls for what is asked of it, answers permission prompts routed to the page |
mod/hooks/lib.js | Helpers with no side effects, including the plugin's version and which capability each request needs |
mod/hooks/rows.js | Turns what Claude Code reports into the rows of a chat, before they are sealed |
mod/hooks/seal.js | The encryption and signing |
mod/tests/ | The plugin's own tests |
mod/agent/agent.mjs | The agent's command line: run, index, search, sessions, read, configure, verify |
mod/agent/service.mjs | The agent as a service: its connection to the server, what it answers, the plugin's measure and its own upgrade |
mod/agent/host.mjs | Sessions the agent starts or resumes itself, and the rules for which it may, and where |
mod/agent/indexer.mjs, store.mjs, transcript.mjs | The index of this computer's transcripts (SQLite, with full-text search) |
mod/agent/lanes.mjs | The page's Timeline: each session of the last week in blocks of a few words, which Claude Haiku makes where that is turned on, kept in the index |
mod/agent/files.mjs | Opening a file that a link in a chat names |
mod/agent/cswap.mjs | Switching between Claude accounts with cswap, where it is installed |
mod/agent/rows.mjs, mod/agent/seal.mjs | Identical copies of the plugin's rows.js and seal.js |
mod/agent/secrets.mjs | Where the agent keeps its token and your key: the keychain on a Mac |
The guide at https://manyclaws.dev/setup walks through it, and Claude Code can follow it for you. It installs the plugin from this repository, as its main branch stands:
claude plugin marketplace add redimaker/manyclaws
claude plugin install manyclaws@manyclaws
Then, in a new Claude Code session, the plugin shows a code of nine digits that connects the computer: type it under Connect a computer (<server>/app#/connect) where you are signed in to ManyClaws, press Connect, and give your passkey. Nothing is typed into Claude Code. The agent is set up from the computer's page, by the plugin, from the copy it carries; or by hand, bash <the plugin's folder>/agent/install.sh --from <the plugin's folder> --auto-folders.
Updates are offered on your page, for each computer, and you approve each one there: the agent has Claude Code fetch the plugin, holds what arrived to the release you approved, and replaces itself from the copy the new plugin carries, putting the old one back where the new one does not start. By hand: claude plugin marketplace update manyclaws, claude plugin update manyclaws@manyclaws, then bash <the plugin's folder>/agent/install.sh --update --from <the plugin's folder>.
A computer whose plugin or agent is from before 6.0.0 is moved once, by https://manyclaws.dev/upgrade (web/upgrade.md here), which the page sends an account to; from then on it is kept up to date from the page. To install from source, so that what runs is what you read: the guide's "Installing from source" checks out a release by its tag (release-N), checks its signature and every file with ssh-keygen and shasum, and has Claude Code load the plugin from that folder as it is.
The plugin needs Claude Code 2.1.287 or later. The agent needs Node.js 22.13 or later and ssh-keygen (which comes with OpenSSH), and nothing else; it is for macOS, Linux and Windows. On Windows it is installed by Git Bash, which Claude Code runs with there, and kept running by a task of Task Scheduler's that starts it as you sign in, with no window of its own (ManyClaws agent; what it runs is ~/.manyclaws/agent-run.cmd, which starts the agent again five seconds after it stops). Its token and key are in agent.json, which only you can read, as on Linux.
mod/release.json lists every file in mod/ (the agent among them), web/ and .claude-plugin/ with its SHA-256, and mod/release.json.sig is that list signed (an SSH signature, under the namespace manyclaws-release) with a key that is kept neither in this repository nor on any server. The key it must be signed by is written in mod/agent/install.sh (SIGNERS) and in web/app.js (RELEASE_SIGNERS); its fingerprint is SHA256:io1QPFB46L+VwdcC+tboq0RQktgBYAn92v0we2RdK+A. Each release is the commit tagged release-N, for its number.
node ~/.manyclaws/agent/agent.mjs verify holds the plugin as Claude Code installed it against the list it carries.On a computer that has the agent:
node ~/.manyclaws/agent/agent.mjs verify
It checks the signature on the list the agent was installed by, that the agent's files are as that list has them and that the plugin Claude Code installed is as the list it carries has it, and that what your server hands a browser for its page is as the (signed) list the server says its page is of. --here leaves the page out.
The page can be checked by hand, from any computer. Every script and style sheet the page loads is named in its HTML with the hash of the file, and a browser does not run one that is anything else; so the HTML is the one file to compare:
curl -s -H 'Accept: text/html' https://manyclaws.dev/app | shasum -a 256
against web/index.html in release.json (the server hands out the same list at /release.json, with /release.json.sig). The header asks as a browser asks for a page: a proxy in front of a server that adds a script of its own to pages adds it to what is asked for so, and to nothing else, and verify asks both ways for the same reason. The page shows the same hashes under Account, as your browser has the files: that is the page's own word, and a page that had been changed could say anything, so it is there for convenience and the checks above are the ones that count. What neither can see is a server that hands one page to whoever checks and another to you.
What ends up on your computer is these files, so you can also compare them yourself:
~/.manyclaws/agent/, against mod/agent/ here (its version is VERSION in mod/agent/service.mjs);manyclaws/, against mod/ here (its version is in mod/.claude-plugin/plugin.json).Both parts are limited by what the computer's owner sets, on that computer:
+files) and running commands (+exec); the full list is in mod/hooks/lib.js.--spawn), and, where its owner allows it (--auto-folders, or from the page), in the folders a person has used Claude Code in on that computer in the last 90 days: never the home folder or one above it, a temporary one, or one inside a folder whose name starts with a dot, and no new folder is made in those. Without either it only reads and searches. It starts one only for a device of yours that may start sessions: one you said is your own, unless you turned that off for it under Account, Devices. It starts them in any of Claude Code's permission modes, bypassPermissions too, in which a session does whatever it is prompted to with nobody asked, unless the computer's owner narrows them (--mode, or the list spawn.modes in ~/.manyclaws/agent.json)."lanes": { "on": true } in agent.json; any of your devices turns it off). It runs Claude Code there (claude -p --model haiku --effort high, with no tools, no MCP servers, no hooks and nothing kept on disk) on what was typed and answered in each session of the last week, which spends Claude tokens on the account Claude Code is signed in to; what it makes is kept in the agent's index and sent, sealed, to your devices. Until then the Timeline's blocks are made of the times alone, and nothing is run.--files, or "files": [...] in agent.json), and from the temporary folders (/tmp, /var/tmp and the one the system gives the agent), where a session so often leaves a screenshot or a log; "files": false opens none, those included. Where a file really is decides: a link inside those folders that leads out of them opens nothing.--spawn), and nowhere else: one you upload to a session's folder, one you attach to a reply (kept in .manyclaws-uploads under that folder, which git ignores), or one you opened, changed on the page and saved back. A folder named only for opening files () is read and not written, unless says ; and the temporary folders are read and not written, but where sessions may be started in one; has none taken anywhere. A new file never takes the place of one that is there, and a file saved back is written only over the file you opened: where it has changed on the computer since, it is left alone until you say to save over what is there now. Nothing is written among the agent's own files.The plugin's tests run with Claude Code's own test runner:
cd mod && claude plugin test .
The end-to-end tests, which run the plugin and the agent against a real server and real Claude Code sessions, live with the server.
mod/agent/verify.mjs| Holds what is installed, the plugin Claude Code installed, and what a server hands a browser, against the signed release |
mod/agent/install.sh | Installs the agent as a service of your own user (launchd on macOS, systemd on Linux, on Windows a task of Task Scheduler's at sign-in, run by Git Bash), from a signed release and nothing else |
mod/release.json, mod/release.json.sig | The release: every file of the plugin, the agent and the page with its SHA-256, and that list signed |
web/ | The page: index.html, app.js, keys.js, seal.js and what they show; and the two guides Claude Code can follow, setup.md and upgrade.md |
release.mjs | Makes a release, writes the page's integrity values, and tags the commit a release is in |
.claude-plugin/marketplace.json | Lets Claude Code install the plugin from this repository |
--filesagent.json"upload": true"upload": false