🗂 Source Map

Getting Started

Install NemoClaw with a single command (requires Ubuntu 22.04+, Node.js 22.16+, Docker, 8 GB+ RAM):

Bash
# Install NemoClaw
curl -fsSL https://www.nvidia.com/nemoclaw.sh | bash

# Run the interactive onboarding wizard
nemoclaw onboard

# Connect to your sandboxed agent
nemoclaw my-assistant connect

# Check sandbox health
nemoclaw my-assistant status

# Stream logs in real time
nemoclaw my-assistant logs --follow

# Open the monitoring terminal UI
openclaw tui

Source Code Walkthrough

CLI Command Registration

The plugin uses Commander.js to register subcommands. Each command delegates to a focused module.

TypeScript nemoclaw/src/commands/index.ts:L1-L35 View on GitHub ↗
import { Command } from 'commander';
import { onboard } from '../onboard/wizard';
import { connectSandbox } from './connect';
import { getSandboxStatus } from './status';

export function registerCommands(program: Command): void {
  program
    .command('onboard')
    .description('Set up a new NemoClaw sandbox')
    .action(onboard);

  program
    .command('<name> connect')
    .description('Connect to a running sandbox')
    .action(connectSandbox);

  program
    .command('<name> status')
    .description('Check sandbox health')
    .action(getSandboxStatus);
}

Blueprint Resolution & Verification

The resolver downloads blueprints from the registry but validates the SHA-256 digest before execution, preventing supply-chain attacks.

TypeScript nemoclaw/src/blueprint/resolver.ts:L10-L55 View on GitHub ↗
import { createHash } from 'crypto';
import { readFile } from 'fs/promises';

interface BlueprintManifest {
  version: string;
  digest: string;
  minPluginVersion: string;
}

export async function verifyBlueprint(
  path: string,
  expectedDigest: string
): Promise<boolean> {
  const content = await readFile(path);
  const actualDigest = createHash('sha256')
    .update(content)
    .digest('hex');

  if (actualDigest !== expectedDigest) {
    throw new Error(
      'Blueprint digest mismatch -- possible tampering'
    );
  }
  return true;
}

SSRF Validation

Prevents the agent from tricking NemoClaw into making requests to internal network addresses.

TypeScript nemoclaw/src/blueprint/ssrf.ts:L1-L30 View on GitHub ↗
const BLOCKED_RANGES = [
  '127.0.0.0/8',     // loopback
  '10.0.0.0/8',      // private class A
  '172.16.0.0/12',   // private class B
  '192.168.0.0/16',  // private class C
  '169.254.0.0/16',  // link-local
];

export function validateUrl(rawUrl: string): boolean {
  const parsed = new URL(rawUrl);
  if (!['http:', 'https:'].includes(parsed.protocol)) {
    return false;
  }
  const ip = resolveHostname(parsed.hostname);
  if (ip && isBlockedRange(ip, BLOCKED_RANGES)) {
    return false;
  }
  return true;
}

Sandbox Network Policy

The declarative YAML policy uses a Kubernetes-style format with deny-by-default egress.

YAML nemoclaw-blueprint/openclaw-sandbox.yaml:L1-L25 View on GitHub ↗
apiVersion: openshell.nvidia.com/v1alpha1
kind: SandboxPolicy
metadata:
  name: openclaw-baseline
spec:
  network:
    egress:
      default: deny
      allowlist:
        - host: "api.nvidia.com"
          ports: [443]
        - host: "*.openai.com"
          ports: [443]
  filesystem:
    readWrite:
      - /sandbox
      - /tmp
    readOnly:
      - /usr
      - /lib
  process:
    capabilities:
      drop: [ALL]
    seccomp: restricted
💡
Design decisions: TypeScript for the plugin (runs in-process with the Node.js OpenClaw gateway). Python for the blueprint (better subprocess management and Docker interaction). Separate release cycles enable security patches without CLI changes.