add-iron-proxy skill
Install or refresh Iron Proxy and its official Iron Control web console for NanoClaw. Use when selecting the Iron gateway, adding its management UI, configuring credentials and grants, or restoring the proxy, approval bridge, and agent guidance.
Is the add-iron-proxy skill safe?
Serious findings: read the flagged lines first. We read 34 files in the folder on 2026-09-28.
- high
scripts/auth.ts:66Tells the agent to set aside its instructions, hide what it does from the user, or switch off safety checks.
// can finish without asking the user to authorize again. - high
scripts/install-claude.sh:10Downloads a script and runs it in one step, so what runs is whatever that server sends that day. Common for installers, and still worth a look at the address.
# allowlisted unit; the curl | bash pipe lives inside it.
Install the add-iron-proxy skill
A skill is a folder. Copy it into your agent's skills folder and the agent loads it when the task matches its description. Read the findings above first.
git clone --depth 1 https://github.com/nanocoai/nanoclaw.git /tmp/nanoclaw mkdir -p ~/.claude/skills cp -r /tmp/nanoclaw/.claude/skills/add-iron-proxy ~/.claude/skills/add-iron-proxy
In the Claude apps, zip the folder and upload it from the Skills settings. The folder on GitHub
The instructions your agent would load
SKILL.md as published, without the frontmatter. Read it on GitHub
Add Iron Proxy gateway
Install the official iron-control console and PostgreSQL alongside one central Iron Proxy. NanoClaw core supplies the generic gateway seam and human approval flow. Read docs/gateway-seam.md before changing the integration.
Use the bundled setup scripts and the source revisions in versions.json. The console is the upstream Rails application; its UI is not generated or copied into NanoClaw. This is a local Docker installation. Reuse this copy's recorded services and keys when refreshing it.
Install the provider payload
Copy the package's provider, approval middleware, tests, and agent guidance into their normal NanoClaw paths.
payload/src/gateway-providers/iron-proxy.ts -> src/gateway-providers/iron-proxy.ts
payload/src/gateway-providers/iron-proxy.test.ts -> src/gateway-providers/iron-proxy.test.ts
payload/src/gateway-providers/iron-proxy-allowlist.ts -> src/gateway-providers/iron-proxy-allowlist.ts
payload/src/gateway-providers/iron-proxy-approval.ts -> src/gateway-providers/iron-proxy-approval.ts
payload/src/gateway-providers/iron-proxy-approval.test.ts -> src/gateway-providers/iron-proxy-approval.test.ts
payload/src/gateway-providers/iron-proxy-transform.proto -> src/gateway-providers/iron-proxy-transform.proto
payload/container/skills/iron-proxy-gateway/SKILL.md -> container/skills/iron-proxy-gateway/SKILL.md
payload/container/skills/iron-proxy-gateway/instructions.md -> container/skills/iron-proxy-gateway/instructions.mdRegister once
The provider file makes the only product registration call. It declares idempotent sessions, typed runtime contributions, owned-resource cleanup, normalized approvals, network access, and agent guidance. NanoClaw core owns approval persistence, cards, clicks, authorization, and timeouts.
import './iron-proxy.js';Install the bridge dependencies
@grpc/grpc-js@1.14.4
@grpc/proto-loader@0.8.1Install the console and pinned proxy
Setup pulls the pinned official Iron Control image and database image, starts them on a dedicated Docker network, creates a local operator account, and registers this copy's proxy and principal through Iron's API. It stores credentials and encryption keys in owner-only files under data/session-materials/iron-control/. The database has its own persistent volume and no published port. Neither the console credentials nor its database are mounted into agents.
The installer streams stage names and elapsed-time updates. Source downloads stop after two minutes, the image build after twenty minutes, and console startup after six minutes. It never opens a Git credential prompt. The proxy is built locally from the pinned public upstream source, so installation does not require a GitHub account or access to a private proxy image. The console and build dependencies use their pinned public images. On failure, fix the reported access or service issue and rerun setup; keep existing database volumes and encryption keys together. Raw subprocess output is not streamed because it can contain credentials.
Setup builds unmodified upstream Iron Proxy and a separate NanoClaw approval front in the same image. No Iron fork or source patch is used. The front is the only network-facing listener. It authenticates session identities, inspects each HTTP request inside HTTPS tunnels, checks the allowlist, and waits for an explicit approval before forwarding to Iron on 127.0.0.1:18080. Empty, malformed, rejected or timed-out decisions fail closed. Iron's own dial-time loopback and link-local deny rules prevent DNS aliases from reaching the internal backend. Managed control-plane updates only change Iron's credential transforms; they cannot remove the front's checks.
The front builds and runs the pinned OneCLI helper in gateway-compat/onecli-summary; do not add app-specific rules. Only method, host, path, response status and the resulting OneCLI summary reach the approval bridge. Raw bodies, authorization headers, query strings and Iron transform traces do not. The helper sees a bounded pre-injection body prefix; the full original stream is preserved. Read the approval-presentation contract in docs/gateway-seam.md. The build tests stock Iron, the front, and the summary helper, then records an immutable image ID and source hash. NanoClaw's approval service uses a private Unix socket on Linux. On macOS it uses loopback with mutual TLS and a proxy-only client certificate. Credentials pass directly from Iron Control to Iron Proxy.
NANOCLAWIRONPROXY_PORT in .env sets the internal proxy port (default 8080). Setup uses the same value for the front listener and the agent proxy URL. This does not publish a host port. Re-run setup and restart this NanoClaw copy after changing it.
NANOCLAWIRONCONTROL_PORT sets the console port (default 10257). Only 127.0.0.1 is published. Set it before setup if another install uses that port; use the URL printed by setup. The official image currently targets linux/amd64; Docker on Apple Silicon runs it with emulation.
pnpm exec tsx .claude/skills/add-iron-proxy/scripts/setup.ts --with-controlTroubleshooting
The installer uses the public source in versions.json and disables interactive Git prompts. Check connectivity and the pinned revision, then retry.
- Source access fails: verify the pinned source is readable from this machine.
download, image build, or console startup failed. Check connectivity and Docker health before retrying. The installer terminates the timed-out process group.
- A command times out: use the last printed stage to identify whether source
Keep the database volume and encryption keys together; do not generate replacement keys for an existing database.
- The database exists but keys are missing: restore its matching control.env.
Validate
pnpm run buildpnpm exec vitest run src/gateway-providers/iron-proxy.test.ts src/gateway-providers/iron-proxy-approval.test.ts src/gateway-providers/gateway-provider-registry.test.ts src/gateway-approval-coordinator.test.ts .claude/skills/add-iron-proxy/scripts/control.test.ts .claude/skills/add-iron-proxy/scripts/provider-credentials.test.ts .claude/skills/add-iron-proxy/scripts/credential-isolation.test.ts .claude/skills/add-iron-proxy/scripts/install-command.test.tsThe setup consumer writes NANOCLAWGATEWAYPROVIDER=iron-proxy only after every directive succeeds. Restart only this copy's NanoClaw service after an upgrade so its session contribution and approval bridge match the new installation. Check the proxy has synced its assigned principal before reporting the gateway ready.
The request order is front identity and allowlist → human approval → stock Iron credentials → upstream. The front also requires an explicit response decision before returning upstream data. HTTPS tunnels pin the target authority; each inner HTTP request is checked again. Streaming responses and WebSocket upgrades use this same request/response gate. Credentialed application requests use HTTPS; the approval bridge rejects plaintext HTTP destinations. Do not rewrite an HTTP request’s approval metadata as HTTPS to bypass that restriction. The bridge forwards every allowed HTTP request to core as a default approval request. Core uses the active agent provider’s model-domain declaration to permit model traffic without a card; other destinations retain human approval. CONNECT verifies identity; the inner HTTP request is the approval point. Existing standalone model credentials are moved into Iron Control during setup and removed from the old secret file after successful storage and grant.
Open and use the official console
Open the URL printed by setup. Give the operator the path to login.txt in the same private directory; keep passwords and API tokens out of chat and command logs. control.ts status prints only the URL and login-file location.
The pinned console provides Secrets, Credentials, OAuth Apps, and Principals. Use Secrets to create a credential, choose its source, and set its host, method, and path rules. The current console shows principals and grants but creates grants through its API. Apply a secret to this NanoClaw copy with the bundled helper:
pnpm exec tsx .claude/skills/add-iron-proxy/scripts/control.ts grant static <secret-id>Other supported kinds are gcp, aws, oauth, postgres, and hmac. The command only grants an existing credential to this install's recorded principal. Read references/control-plane.md for the exact supported UI, source links, policy example, and verification steps.
The pinned source has no general egress Policies screen or audit search. Do not promise the screens shown in newer or hosted documentation. A grant's request rules govern credential use; the local egress allowlist remains separate.
To allow another destination explicitly, the operator runs:
pnpm exec tsx .claude/skills/add-iron-proxy/scripts/setup.ts --allow-host <hostname-or-*.domain>For a standalone proxy without the console, omit --with-control on a fresh install. A recorded console is preserved on refresh. Both modes build the pinned public source. To reuse an independently built image, build the exact commit from versions.json and label the image org.opencontainers.image.revision with that commit. Then run pnpm exec tsx .claude/skills/add-iron-proxy/scripts/setup.ts --local-image . Setup checks the revision and records the immutable local image ID. All installs require the exact bundled approval-front label; a stock Iron image alone is not the full NanoClaw integration.
Codex authentication
Use the existing provider-auth entry point after /add-codex installs the provider. Browser sign-in, device pairing, and API-key entry are the same for all gateways; scripts/credential-store.ts supplies Iron's custody adapter. Iron Control stores API keys and manages subscription refresh-token rotation through its native broker. Agents receive only a synthetic auth.json file. A subscription login uses a new, dedicated Codex session; never copy personal Codex credentials. The setup flow and provider picker stay unchanged.
pnpm exec tsx setup/index.ts --step provider-auth codexOpenCode authentication
After installing /add-opencode, use the same provider-auth entry point:
pnpm exec tsx setup/index.ts --step provider-auth opencodeThe OpenCode setup flow supports ChatGPT sign-in and API keys through Iron Control. It installs no OneCLI service and needs no OneCLI management settings. ChatGPT arrives as the seam's chatgpt OAuth profile: Iron creates a native broker from OpenCode's public OAuth client and refresh token, and a separate granted secret carries the ChatGPT-Account-Id header; any other OAuth profile is rejected. The agent sees only placeholders. Initial sign-in and reauthentication wait for the native broker to refresh successfully (up to two minutes) before setup continues. API keys use each backend's declared header scheme. Setup grants the secrets to this install's principal and permits the model hostname. Rotation and reauthentication keep IDs and grants. Moving a key to another host requires confirmation and re-entering its value.
Native backends and custom/keyless HTTPS endpoints on port 443 are supported. Use a DNS name and TLS for local models; plaintext HTTP endpoints fail during setup. Follow the OpenCode skill to restart the host and test a real reply.
Remove
Follow REMOVE.md. Stop only this copy's proxy and console services. Keep the database volume and encryption keys together when preserving data.
Provider credentials on shared model hosts
OpenCode and Codex use distinct non-secret markers. Iron replaces only the matching header marker, so each runtime retains its own account on a shared HTTPS host. Claude's managed model marker remains distinct. These replacements use require: false: a request from another provider must pass without substitution. The upstream API still rejects an unavailable or unmatched placeholder.
Refresh the installed provider payloads and rebuild the agent image before using this version. Reconnect older Codex credentials to replace their host-wide injection rules. If setup identifies a conflicting legacy or manual grant, reconnect that provider with this version (including Claude's model credential), or remove the conflicting grant in Iron Control. Stored secrets are write-only and are not silently rewritten. Setup checks direct and role grants, including inactive OAuth brokers. The installation's Iron principal remains the authorization boundary; these markers select credentials, not permissions for separate untrusted tenants.
More skills from nanocoai/nanoclaw
- Aadd-anydocAdd local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when agents need to read attached Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV, or text-based PDF files without uploading them to a hosted parser.
- Aadd-atomic-chat-toolAdd Atomic Chat MCP server so the container agent can call local models served by the Atomic Chat desktop app via its OpenAI-compatible API.
- Fadd-clidashAdd clidash — a zero-dependency, read-only web dashboard that derives its tabs and tables at runtime from any CLI that lists resources as JSON. Ships pre-wired for NanoClaw's ncl CLI (agent groups, sessions, channels, users, roles), plus message-activity charts, a log tail, and a read-only file viewer for group skills/CLAUDE.md/profiles.
- Aadd-codexUse Codex (OpenAI's codex app-server) as a full agent provider — planning, tool orchestration, MCP tools, server-side history, session resume — alongside or instead of Claude. ChatGPT subscription or OpenAI API key, vault-only via the selected gateway. Per-group via `ncl groups config update --provider codex`. Distinct from using OpenAI as an MCP tool (where Claude remains the planner).
- Aadd-dashboardAdd a monitoring dashboard to NanoClaw. Installs @nanoco/nanoclaw-dashboard and a pusher that sends periodic JSON snapshots.
- Aadd-deltachatAdd DeltaChat channel integration via @deltachat/stdio-rpc-server. Native adapter — no Chat SDK bridge. Email-based messaging with end-to-end encryption.
- Cadd-dialAdd Dial channel integration — a real phone number for SMS and AI voice calls via the Dial platform (getdial.ai). Native adapter — no Chat SDK bridge.
- Aadd-dial-numberAdd another phone number to an existing Dial channel — a second (or third) public line for the agent, so one NanoClaw install answers SMS and AI voice calls on multiple numbers. Use when Dial is already installed and the operator wants an additional number (e.g. a personal line plus a support line). Requires the Dial channel to already be installed (see /add-dial).
- Aadd-dial-toolGive chosen NanoClaw agents a real phone number as a container tool — the `dial` CLI baked into the agent image plus OneCLI credential injection for api.getdial.ai, scoped per agent, so the agents you pick can send SMS, place AI voice calls, and receive verification codes from inside the sandbox. Independent of the Dial channel; idempotent; re-run to change which agents may use it. Use when the user wants agents to text, call, or run `dial …` from a chat, without wiring Dial as a messaging channel.
- Aadd-discordAdd Discord bot channel integration via Chat SDK.
- Aadd-emacsAdd 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). Local HTTP bridge — no bot token or external service needed.
- Aadd-gchatAdd Google Chat channel integration via Chat SDK.