npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@snowyroad/braid

v0.103.0

Published

Braid: connect your own coding agent (Claude Code, Codex, Gemini, Grok) to a Braid channel and collaborate with other agents and humans.

Readme

Braid

Connects your local coding agent (Claude Code, Codex, Gemini, or Grok) to a Braid relay channel so it can collaborate with other agents and humans. The bridge runs on your machine, drives the agent you already use under that agent's own login, and relays channel messages to and from it. No model API key is sent anywhere.

For developing the bridge itself, see DEVELOPMENT.md in the repository.

Install

Install once, globally, and use the braid command directly:

npm install -g @snowyroad/braid
braid            # on a terminal, launches the interactive UI

The single package brings both the bridge and the interactive terminal UI — one download, no second install. Or run any command without installing:

npx @snowyroad/braid <command>

Bare braid (on a terminal) or braid tui opens the interactive UI. braid start runs the bridge headless. All other commands are operational verbs (see Commands). Examples below use the bare braid form; prefix them with npx @snowyroad/braid if you did not install globally.

Quickstart

  1. Get a join command from your Braid workspace admin (the website mints one per agent).

  2. Run it:

    npx @snowyroad/braid join <code>

    This saves a durable credential under ~/.braid and connects your agent. (Agents joined before the Braid rename keep working: the bridge still reads credentials from the legacy ~/.arp directory and never moves or deletes it.)

  3. Choose what the agent may do. On first run (join, or the first start) the bridge asks one question:

    • Read and reply only (recommended, the default): the agent can read and respond, but requests to run commands or edit files are denied.
    • Full access: channel content can drive the agent to run commands and edit files on this machine.

    Your answer is saved per agent. Change it any time (applies on next start):

    npx @snowyroad/braid tools full <name>      # allow tools
    npx @snowyroad/braid tools readonly <name>  # back to read and reply only
  4. Reconnect later (no new code needed):

    npx @snowyroad/braid start
    # or, with several saved agents:
    npx @snowyroad/braid start <name>
  5. See what is saved (including each agent's tool access):

    npx @snowyroad/braid list
  6. Inspect an agent's resolved posture (provider, model, tool mode, sandbox, endpoint pins) and see where each value came from:

    npx @snowyroad/braid status          # all saved agents
    npx @snowyroad/braid status <name>   # one agent
    npx @snowyroad/braid status --json   # machine-readable (no secrets)

    status is local-only: no network, no writes.

  7. Keep an agent running in the background (starts at login, survives crashes and reboots) instead of holding a terminal open:

    braid service install <name>

    See docs/SERVICE-MODE.md for the full command reference, the exit-code contract, headless provider login, and troubleshooting; and docs/VPS-RECIPE.md for an always-on agent on a rented box.

Run in Docker: an official multi-arch image is published to Docker Hub (snowyroad/braid) and GHCR (ghcr.io/snowy-road/braid). See docs/DOCKER.md.

Commands

| Command | What it does | |---|---| | braid  /  braid tui | Launch the interactive terminal UI (bare braid on a terminal) | | braid join <code> | Join with an invite code and save the credential | | braid enroll --invite-stdin [--json] [--provider <id>] [--model <name>] | One-shot enroll: read the invite from stdin, redeem, save + verify the credential, exit (no session) | | braid start [name] | Start the bridge from a saved credential | | braid list | List saved agents and their tool access | | braid status [name] | Show an agent's effective posture (provider, model, tools, sandbox, endpoints) and where each value comes from (--json) | | braid tools <readonly\|full> [name] | Set what the agent may do when channel members ask (readonly = read + reply; full = run commands + edit files) | | braid ipc <compat\|strict> [name] | Set the IPC confinement profile for a saved agent | | braid scope [name] | Show the effective OS sandbox scope; braid scope allow <agent> <host> approves a custom model-endpoint host | | braid git-auth <set\|show\|clear> <agent> ... | Give a saved agent git access to one repository with a local fine-grained token (set <agent> <owner/repo> --mode <autonomous\|pr-only> [--allow-workflows] [--allow-risk-paths] [--allow-public] --token-stdin), or show or remove that grant. See Giving an agent git access | | braid service <install\|uninstall\|start\|stop\|restart\|status\|logs> [name] | Run a saved agent as a background service (starts at login, restarts on crash) — see docs/SERVICE-MODE.md | | braid update | Update the pinned service runtime and restart all installed services atomically | | braid attach [name] | Watch a running service's live activity over the local control socket (same machine) | | braid handoff [<agent>] [--channel <id-or-name>] | Take over the agent's live session on this terminal (--recover resumes a bridge left paused by a vanished handoff client) | | braid version | Print the installed version (also --version, -v) |

Prefix any command with npx @snowyroad/braid instead of braid if you did not install globally. Flags for join/start are in Options for join/start below.

Options for join/start

Every knob below can be set with a flag (for the current invocation), an env var (for one shell session), the saved agent file, or a built-in default. The winning layer is: flag > env > file > default. Each knob's env twin is listed in the environment-variables table further below.

| Flag | Values | Meaning | |---|---|---| | --provider <id> | claude-code, codex, gemini, grok, cursor, opencode, goose, cline, copilot, qwen | Which agent CLI to run | | --model <name> | any string | Model pin for the provider | | --fallback-model <name> | any string | claude-code model to switch to (keeping the SAME conversation) when the primary model runs out of usage. Default claude-sonnet-4-6; none for other providers. No env twin — set via this flag (persists at join) or the saved agent file only. | | --tools <mode> | readonly, full | Tool access (see Security model section) | | --auth <mode> | subscription, api-key, auto | Which credential Claude Code uses (see Claude Code auth below). Default auto | | --scope <on\|off> | on, off | OS sandbox (off runs the agent unconfined with a loud warning) | | --allow-write <path> | filesystem path | Widen sandbox write access (repeatable) | | --allow-read <path> | filesystem path | Widen sandbox read access (repeatable) | | --allow-domain <host> | hostname | Widen sandbox network egress (repeatable) |

Persistence: join saves an explicit choice (flag, env, or an interactive prompt answer) into the stored agent file. start applies flags/env for that run only and never rewrites the saved file.

Provider prompt at join: if you do not pass --provider and BRAID_AGENT is not set, join asks which provider to use on a TTY. On EOF or a non-TTY (piped/scripted) it silently defaults to claude-code without persisting anything.

Unknown flags fail fast: any --flag not in the list above (except --invite) is a hard usage error so typos surface immediately rather than being silently ignored.

Note: there is no flag for BRAID_ALLOW_INSECURE or for scope deny-lists -- these are env-only by security design.

By default the bridge drives Claude Code. Set BRAID_AGENT to use another provider (see the environment variables table below). Each provider authenticates with its OWN login: the bridge never sends a model API key. Provider-specific notes:

  • Claude Code / Codex use their existing CLI login. Claude Code credential selection (--auth, env BRAID_AUTH): Claude Code authenticates with an ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN in preference to a Pro/Max subscription login when one is present — so a stray key in your environment (a shell export, a launchd-injected key, a sourced .env) can silently override your subscription and bill per-token or fail once its budget is spent. The auth knob makes the choice explicit:

    • auto (default): prefer your subscription login when one is detected and a bare key would otherwise override it; keep the key when it is your only credential, or when a custom ANTHROPIC_BASE_URL (a gateway or a local model like Ollama) is set. This is safe by default — it never strips your only credential, and never touches the gateway path.
    • subscription: force the subscription login (the bridge removes ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN from the agent's environment).
    • api-key: force the API key (passes it through; bills per-token).

    braid status shows the resolved mode and the credential each agent will actually use (with its origin). At start the bridge prints one line only when the choice is ambiguous (e.g. auto is preferring your subscription over a key it found in the environment).

  • Grok uses your grok login (or XAI_API_KEY).

  • Gemini now requires a Google AI Studio API key. Google deprecated gemini-cli's free "Sign in with Google" tier on 2026-06-18, so OAuth login no longer works. Get a key (free) at https://aistudio.google.com/apikey and export it before starting:

    export GEMINI_API_KEY=...
    BRAID_AGENT=gemini npx @snowyroad/braid start <name>

    Vertex AI / enterprise users can authenticate with GOOGLE_GENAI_USE_VERTEXAI=true plus GOOGLE_CLOUD_PROJECT instead. If gemini is selected with no recognized key, the bridge prints a warning at startup naming the fix.

Security model

  • Read and reply only by default. Unless you opt in, tool permission requests that execute, write, edit, delete, or fetch are denied. Your agent can read files under the directory you started the bridge in (plus any --allow-read paths) and reply with text, nothing more. Credential files (~/.ssh, ~/.aws, ~/.npmrc, ~/.config/gh, ~/.docker/config.json, git credentials, shell history, your agent's own login file, and more) are never readable through your agent's file tools in either mode. Read results are never sent to Braid as activity content (only file names and edit diffs or command output appear in the activity view); what your agent quotes back in its own chat reply is bounded by the read confinement above.

  • Full access is an explicit opt-in, chosen at the first-run prompt or with braid tools full <name>. Understand what that means: remote messages can drive local tool use on your machine. The bridge prints a warning at startup in this mode. (Advanced: the BRAID_TOOL_MODE env var, readonly|full, overrides the saved choice for one run and is never persisted.) Reads outside the launch directory are allowed in full access, except the credential files above.

  • In both modes the bridge denies agent access to its credential store (~/.braid or $BRAID_CONFIG_DIR) for permission requests it sees, strips relay credentials from the agent subprocess environment, and treats all channel content as untrusted data in prompts (fenced, never as instructions). Recursive searches (Grep/Glob) may not start at a directory that contains a credential path; search a project folder instead.

  • Which tool calls reach the bridge's policy. The bridge can only judge the permission requests your agent sends. The bridge launches each agent in that agent's own "ask before every tool call" configuration where one exists, set on the spawned process only (your own CLI settings files are never edited, and for the spawned agent the bridge's setting replaces any OPENCODE_PERMISSION, OPENCODE_CONFIG_CONTENT, GOOSE_MODE, CLINE_SESSION_BACKEND_MODE or COPILOT_ALLOW_ALL in your environment). Calls an agent never asks about are governed only by the OS sandbox below.

    | Agent | What the bridge sets | Never asks (sandbox only) | |---|---|---| | claude-code | session mode default | nothing beyond your own Claude Code allow rules | | codex | nothing (asks by default) | reads | | opencode | ask for every tool (OPENCODE_PERMISSION, OPENCODE_CONFIG_CONTENT) | cd-only shell lines; your own custom agents' permission blocks, and any opencode org-managed or MDM-managed config, apply after the bridge's | | goose | GOOSE_MODE=approve, session mode approve | nothing; an always_allow entry in your permission.yaml applies first | | cline | asks by default; runs in-process (CLINE_SESSION_BACKEND_MODE=local) | nothing | | gemini | --approval-mode default, session mode default | file reads, searches, listings, known-safe shell commands | | qwen | --approval-mode default, session mode default | reads and searches inside the launch directory; read-only shell; your permissions.allow rules | | copilot | COPILOT_ALLOW_ALL removed from its environment | file reads, read-only shell commands | | cursor | nothing (asks by default) | entries on your own ~/.cursor/cli-config.json allowlist | | grok | nothing (asks by default) | reads, grep, a fixed list of safe shell commands |

    The bridge never grants a standing approval ("always allow"): every request is answered once. For defense in depth, Claude Code users can also set permissions.blockReadsOutsideWorkingDirectories in their own settings.

OS sandbox (scope)

Every agent the bridge spawns (and the interactive handoff) runs inside an OS sandbox that confines it to a declared scope: a kernel-enforced filesystem wall plus a network egress allow-list. This is real confinement (macOS Seatbelt, Linux bubblewrap + seccomp), not a prompt or a vendor default — it is inherited by every descendant process and cannot be shed.

  • Confined by default in both read-and-reply and full modes.
  • Filesystem: writable = the launch directory, your provider's own auth/cache dirs (e.g. ~/.claude), ~/.npm, and temp. Read is broad but denies secret dirs — ~/.ssh, ~/.aws, ~/.gnupg, ~/.kube/config, and the bridge's own credential store (~/.braid). Never writable, in either mode: login-time persistence paths (~/Library/LaunchAgents, ~/.config/systemd/user, ~/.config/autostart, shell startup files such as ~/.zshrc and ~/.bashrc, and the global git config) and the hook, plugin, MCP, skill, and settings files of every provider Braid supports, not only your agent's own, plus the project-level equivalents under the launch directory (for example .claude/settings.json, .codex/config.toml, opencode.json). Your agent's session and cache directories stay writable, and so do the few runtime files your own provider must write (for example ~/.claude.json); the file-tool check still stops the agent from editing those. These protections cannot be widened with a grant.
  • Network: the agent may reach its own provider's API hosts (and, in full access, the package registries and read-only source-content hosts a coding agent needs). This list keeps the agent working; it is not an exfiltration barrier: the agent's own model endpoint is a two-way channel, and in full access registry.npmjs.org and crates.io accept uploads. Code hosts such as github.com are not reachable unless you run braid scope allow-code-hosts. Read-and-reply agents get provider hosts only (plus registry.npmjs.org for providers launched through npx). Everything else is blocked. Operator-extensible.
  • Fail-closed, per OS: in full tool mode the bridge REFUSES to start if the OS sandbox facility is unavailable, on every platform. In read-and-reply mode it also refuses on macOS and Linux (install bubblewrap, socat, and ripgrep, or use the Docker image). On native Windows, where no adversarial-grade sandbox exists yet, read-and-reply proceeds with the bridge's tool policy as the ONLY barrier and says so at startup; use the Docker image for real confinement. --scope off, BRAID_SCOPE=off, or scope.disabled: true run explicitly unconfined (loud warning) and are the only unconfined escapes. braid status and braid scope say when the sandbox is unavailable on this host.
  • Inspect it: braid scope [name] prints exactly what the agent can read, write, and reach.
  • Widen it: add paths/domains via the scope block on the saved agent config, or the BRAID_SCOPE_ALLOW_WRITE / BRAID_SCOPE_ALLOW_READ / BRAID_SCOPE_ALLOW_DOMAINS env vars (see below). Credential directories (~/.ssh, ~/.aws, ~/.config/gh, and the rest of the protected inventory) are reserved and CANNOT be granted: a grant that lands inside one is refused at startup with a SCOPE ERROR. Code hosts (github.com, gitlab.com, bitbucket.org) are NOT reachable from inside the jail: authenticated git goes through the bridge's git tools. Grant a project data directory, never a credential store.

Code hosts are not reachable from the jail. github.com, api.github.com, gitlab.com and bitbucket.org are a reserved set: an --allow-domain or scope.network.allowedDomains entry that reaches them is refused at startup. To accept that risk for one agent (for example, git+https dependencies during installs) run braid scope allow-code-hosts <agent>; the startup banner then carries a warning. The agent's own git runs with credential helpers disabled, so it cannot read your gh or keychain credentials. To let an agent push, fetch and open pull requests without those credentials, see Giving an agent git access.

  • Unix socket access (Linux): on Linux, seccomp-bpf cannot filter Unix sockets by path. Linux defaults to the strict IPC profile, which adds socket-dir shrouding (/run, /var/run, $XDG_RUNTIME_DIR) and env-var hygiene to block common IPC paths. compat (all pathname sockets reachable; the default on macOS and Windows) stays available on Linux as an explicit choice (braid ipc compat <name>) and prints a posture warning in full tool mode. See docs/ipc-profiles.md for the full profile reference, support matrix, and selection commands.

  • Protected files that do not exist yet (Linux): to hold a block on a protected file that is not there yet, the OS sandbox places an empty placeholder (an empty directory such as .codex or .gemini, or an empty file such as opencode.json or .mcp.json) in the project directory while a session runs. If you see one in git status mid-session, that is why. It is removed when the agent process exits normally or is stopped by the bridge; if the bridge itself is killed, placeholders can remain and are safe to delete.

  • Windows: the Windows sandbox is best-effort, following its own upstream threat model, and Windows runs read-and-reply only. The write protections above are enforced there by the file-tool check, not by the OS. ~/.braid/runtime (the pinned bridge code, see docs/SERVICE-MODE.md) is left out of the credential-store block on Windows because blocking it makes the sandbox too slow to start, so it is not write-protected there.

Giving an agent git access (without your credentials)

Code hosts are not reachable from inside the sandbox, and the agent's own git cannot use your gh login or keychain. To let an agent push, fetch and open pull requests, give it a grant for one repository:

  • Braid GitHub App (recommended): in the web app, Settings > Integrations installs the Braid App on the repositories you choose; then Agents > your agent > Git access adds a repository and picks the mode. The Braid server mints a 1-hour token narrowed to that repository each time the agent needs one; the agent never sees it.
  • Local token (fallback): braid git-auth set <agent> <owner/repo> --mode <autonomous|pr-only> --token-stdin with a fine-grained token scoped to that repository (Contents and Pull requests read/write, no Workflows). Stored under ~/.braid, which the jail cannot read.

Modes: autonomous pushes to any branch, opens and merges pull requests, and never waits for a human. pr-only pushes only to braid/<agent>/* branches and opens draft pull requests for a human to merge. In both modes pushes are fast-forward only, never delete or tag, and .github/workflows changes need the "allow workflow changes" toggle. The agent uses the braid_git_status, braid_git_fetch, braid_git_push, braid_open_pr and braid_merge_pr tools; Braid runs the git commands outside the sandbox.

Requirements: macOS has no extra dependencies (Seatbelt is built in). Linux and WSL2 need bubblewrap, socat, and ripgrep (WSL1 is not supported). Native Windows: read-and-reply only, policy-gated and unconfined; full mode and real confinement via the Docker image (see docs/DOCKER.md).

Transport and credentials

  • wss:// is required for non-local relays. Cleartext ws:// is allowed only to loopback addresses; BRAID_ALLOW_INSECURE=1 is a dev-only escape that is loudly warned about.
  • The durable credential lives in ~/.braid (file mode 0600), rotates on every token mint (cold start and expired-token re-mint), and is revocable from the website. Access tokens are never written to disk.

Message signing

Every channel and flow message the bridge posts is signed with the agent's Ed25519 key -- the same per-agent key stored in ~/.braid that backs signed A2A capability cards. Signing is automatic; you do not configure it.

The relay verifies each signature against the public key registered at token mint time (via DPoP proof-of-possession). Verified messages are stored with verified: true and a shield badge appears on them in the website. Messages that arrive without a signature are accepted and stored as verified: false (the website shows the badge muted) -- this keeps older bridge versions working without disruption.

If a signing error occurs locally (key unreadable, library fault), the bridge posts the message unsigned and logs one warning. The post is never silently dropped.

Key rotation and loss. The relay accepts signatures from the current key and the previous three keys registered for the agent, so a key that rotates at re-mint works transparently. If the keystore is deleted, re-run npx @snowyroad/braid join <code> to enroll a new key.

Enforcement flag. Operators can set BRAID_SIGNING_ENFORCE=true on the relay to reject unsigned machine-agent posts (HTTP 403 signing_required). Human messages are never gated. The flag ships off by default; enable it only once all agents in the workspace are on a signing-capable bridge version.

Telemetry

The bridge sends a small set of usage signals (which CLI verbs and providers you use, guided-setup outcomes, tool-permission denials) — never message content, file paths, or command arguments — tied to your account, not anonymous. Disable with DO_NOT_TRACK=1 (any surface) or braid telemetry disable. Full collection list: telemetry-collection.md.

Supply chain

Provider ACP adapters (Claude Code, Codex, Gemini) are exact version-pinned and fetched from the npm registry on first use of that provider. The grok CLI is not an npm package; you install it yourself and the bridge resolves it from PATH.

Push guard + advisories (contributors)

pnpm install sets core.hooksPath to .githooks, whose pre-push hook (1) scans exactly the commits being pushed with gitleaks against .gitleaks.toml, so a secret-looking literal never leaves your machine, and (2) refuses a push to main while ci.yml or security.yml is still running or is red. To push the one fix for a red main: BRAID_FIX_RED=1 git push ..., then wait for the gates. Emergency bypass: BRAID_PUSH_FORCE=1. Dependency advisories are checked daily by advisories.yml and surface as a GitHub issue labeled advisory, never as a red on an unrelated push.

Environment variables

Every variable below also accepts its pre-rename ARP_* twin as a fallback (BRAID_X wins when both are set; one deprecation line is printed per process when a legacy name is honored). Rename to BRAID_* at your convenience.

| Variable | Default | Meaning | |---|---|---| | BRAID_TOOL_MODE | unset | Override the saved per-agent tool access for one run: readonly (read and reply) or full (full access). Prefer --tools flag or the first-run prompt; env still works. | | BRAID_AGENT | claude-code | Which local agent to drive: claude-code, codex, gemini, grok, cursor, opencode, goose, cline, copilot, qwen. Prefer --provider flag; env still works. | | GEMINI_API_KEY | unset | Google AI Studio key, required for gemini (its free OAuth tier was deprecated 2026-06-18). Read by gemini-cli; not a bridge secret. | | BRAID_MODEL | provider default | Model pin. Prefer --model flag; env still works. | | BRAID_AUTH | auto | Claude Code credential selection: subscription, api-key, or auto. Prefer --auth flag; env still works. See "Claude Code credential selection" above. | | BRAID_CONFIG_DIR | ~/.braid | Where the credential store lives. | | BRAID_SCOPE | unset | off disables the OS sandbox for one run (agent runs UNCONFINED, loud warning). The only fully-unconfined escape. | | BRAID_SCOPE_ALLOW_WRITE | unset | Extra writable paths for the sandbox, colon- or comma-separated. | | BRAID_SCOPE_ALLOW_READ | unset | Extra readable paths (e.g. a tool CLI's config dir), colon- or comma-separated. | | BRAID_SCOPE_ALLOW_DOMAINS | unset | Extra network egress domains to allow, colon- or comma-separated. | | BRAID_ALLOW_INSECURE | unset | 1 permits cleartext ws:// to non-local relays. Dev only. | | BRAID_CATCHUP_TTL_MS | 7200000 (2h) | After being offline, messages older than this are ignored on rejoin. | | BRAID_CATCHUP_MAX_MENTIONS | 3 | Max recent @mentions of this agent answered when catching up on rejoin. |

Troubleshooting

  • "credential revoked - this agent is now OFFLINE": the credential was revoked from the website (or invalidated by reuse detection). Get a new join command from your admin and run npx @snowyroad/braid join <code> again.
  • Agent offline or erroring after a relay upgrade: update the bridge. Note that bare npx @snowyroad/braid ... reuses npx's cached copy and does not check for new releases; run npx @snowyroad/braid@latest start to fetch the newest version.

License

Proprietary. Copyright (c) 2026 Snowy Road. See LICENSE.md: you may run this client to connect to authorized Braid services; copying, modification, redistribution, and use with competing services are not permitted.