the npx command
npx innernet is innernet on your machine in one line. It signs you in, points every AI tool it can find at your memory, and inside a repo it gives that folder a memory of its own. Then it says what that means: what to try, in plain words, and where the guides are. There is nothing to install: npx fetches the package, runs it, and forgets it. Node 18 or newer.
npx innernetThe same run, with pictures and in plain words, is the guide start in one command.
what one run does#
Before anything happens it prints the plan: two steps anywhere, three inside a git repo. Then each step reports what it did.
- Signs you in. Your browser opens
/api/cli/pair; you sign in (a brand-new account meets its netti first, then comes straight back), and one key is minted for this machine and written to~/.innernet/session.json(mode 0600). The sign-in link is always printed as well, for a machine where no browser opens (ssh, a container). No key is ever pasted into a chat. - Wires every AI tool it finds. It looks for the tools you actually have and writes one
innernetentry into each one's own config, merging with what is there: other servers, comments in TOML, the rest of the file stay as they were. A file it cannot change safely (JSON that does not parse, a ContinuemcpServers:list of your own) is left alone, and the run prints the lines to add by hand. Claude and ChatGPT live in a browser, so the run hands you the link and the clicks for them instead. - Connects the folder you are in. If it is a git repo, it offers to start a memory whose shape netti designs from the README and the file names (nothing else leaves the machine), and writes
.innernet/connection.jsonnaming it. Commit that file (the run reminds you): the link then travels with the repo, and a teammate who clones and runs the same command reads the same memory. If the folder already names a memory your account cannot open, it says so and asks you to get room access from its owner, rather than quietly starting a second one. If it finds an older local.innernet/map from before the memory moved online, it offers to bring it up to innernet.live. - Installs two git hooks in
.innernet/hooks(and pointscore.hooksPathat them):post-commitcaptures every commit's message and diffstat, andpost-mergecaptures what a pull or merge brought in (first-parent, oldest first, up to 40 commits). Both run in the background so they can never slow git down, and each writes one line of outcome to.innernet/last-sync.log(kept out of git), whichinnernet statusreads back. If your repo already has its own hooks path, it prints the line to add instead of overwriting it. - Tells every coding agent where the memory is. It writes a short fenced block into
AGENTS.mdnaming the memory and the four calls that matter (load it, ask it, keep## history, leave a handoff), and adds an@AGENTS.mdimport toCLAUDE.md, so Codex, Cursor, Copilot, Gemini and Claude Code all read the same words.--no-agentsskips this. - Says what now. On a first run it ends with the tools to restart, five things to say to any of them in plain words (the first, load my projects from innernet, is the check that it worked), an
importline when it found Claude Code's own memory on the machine, and links to what to say to your ai and the guides. Every command it suggests is spelled the way you can run it:npx innernet …when you came through npx,innernet …when it is installed.
Re-running is always safe. It re-checks, fixes what drifted, picks up tools installed since, and ends with all set when nothing needed changing. --dry-run shows every file it would touch and writes nothing, not even a sign-in.
the tools it wires#
| tool | where innernet lands |
|---|---|
| Claude Code | its own claude mcp add -s user innernet (or ~/.claude.json when the claude binary is not on PATH) |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json (serverUrl) |
| Gemini CLI | ~/.gemini/settings.json (httpUrl) |
| Continue | ~/.continue/config.yaml, one marked block pointing at the innernet mcp bridge (older builds: config.json) |
| OpenCode | ~/.config/opencode/opencode.json |
| VS Code (Copilot), Cline, Roo Code | their VS Code user storage |
| Antigravity | ~/.gemini/config/plugins/innernet/mcp_config.json (serverUrl) |
| Claude Desktop, Codex CLI, Zed | their own config, pointed at the innernet mcp bridge |
| Claude, ChatGPT | in the browser: the run prints the link and the clicks (step by step) |
Tools that speak streamable HTTP get the hosted URL and this machine's key as an Authorization header. Tools that can only spawn a command get innernet mcp, a thin bridge that reads the same key from ~/.innernet/session.json and forwards to the same URL, written with absolute paths so a GUI app with a bare PATH still finds it. A tool you install later is picked up the next time you run the command. One it does not know yet takes the URL by hand: see connect an AI.
the other commands#
| command | what it does |
|---|---|
innernet status | read-only: who this machine is signed in as, each tool and whether innernet is really in its config (connected · set up with an earlier key · found, not connected), this folder's memory, whether the hooks run, and the last capture from .innernet/last-sync.log, with the reason when it failed. -p <dir> checks another folder |
innernet guide [chapter] | the tour in the terminal: what to say to your AI, grouped by habit, the commands, and every guide with its link. A chapter (fundamentals, connect, dashboard, builders, sharing) lists its guides; say prints the phrasebook alone; --open also opens it in the browser. Alias: tour |
innernet login / logout / whoami | sign in, forget the key here, or ask who this machine is |
innernet import claude | Claude Code's own memory (~/.claude/projects) |
innernet import chatgpt <file> | a ChatGPT export (conversations.json) |
innernet import dir <path> | a folder of .md / .txt notes |
innernet import local [dir] | an older local .innernet/ map, moved up to innernet.live |
innernet capture "<text>" | note something from a terminal or a script (-s <source>, -t <tags>, -p <dir>, -q for quiet). The git hooks call exactly this. A capture that can't reach innernet.live waits in ~/.innernet/outbox.jsonl (500 at most) and goes out first with your next capture, so a dropped connection never loses it and a retry never writes it twice |
innernet sync | send the captures that were waiting in the outbox now. Quiet with -y, and always exits 0, so an older hook that calls it never breaks |
innernet mcp | the stdio bridge, for tools that can only spawn a command |
Each is npx innernet … without an install, or innernet … after npm i -g innernet.
Flags on connect (what bare innernet runs): -y accepts the defaults, --dry-run writes nothing, --no-repo leaves the current folder alone, --no-agents leaves AGENTS.md alone, --no-open prints the sign-in URL instead of opening a browser, and -p <dir> connects a folder other than this one. Piped or in CI (no terminal), a question takes its default and the log says so.
Two environment variables: INNERNET_API_KEY uses a key instead of the paired session (handy in CI), and INNERNET_URL points the CLI, and every link it prints, at another host.
Older verbs from the local-first CLI (init, branch, self…) still exist as quiet shims that print "retired" and exit 0, so an old script never breaks a build.
what it never does#
- No key in a chat. The key lives in
~/.innernet/session.jsonand in the config files of the tools it wired, on this machine only.logoutforgets it here; re-running rotates what the tools hold. - No local copy of your memory. The map lives at innernet.live; every tool reads and writes the same one, so there is no second copy to sync or to go stale. The only thing kept here is the outbox: captures that could not go out yet.
- No model on your machine. Every model call happens server-side.
- Nothing silent. Every file it touches is printed, a file it cannot change safely is left alone with the lines to add, and
--dry-runshows it all first.
Wiring a single client by hand instead is one URL: connect an AI. What the tools can then do with your memory is in MCP tools, and what to say to them is what to say to your ai.