Skip to content

feat: add Jetson device support (tested on Orin Nano) - #249

Closed
hholtmann wants to merge 7 commits into
NVIDIA:mainfrom
hholtmann:jetson-support
Closed

feat: add Jetson device support (tested on Orin Nano)#249
hholtmann wants to merge 7 commits into
NVIDIA:mainfrom
hholtmann:jetson-support

Conversation

@hholtmann

@hholtmann hholtmann commented Mar 17, 2026

Copy link
Copy Markdown

Summary

Adds scripts/setup-jetson.sh, Jetson documentation, and an ollama blueprint profile to enable NemoClaw on NVIDIA Jetson devices running L4T (Linux for Tegra).

The setup script is self-contained (does not delegate to setup.sh) because the gateway image must be patched between the pull and restart steps — setup.sh would clobber the patch by re-pulling the upstream image.

What the script does

  1. Loads missing kernel modules (br_netfilter, xt_comment, xt_conntrack, ipset types) that L4T ships but does not load at boot
  2. Configures Docker for cgroupns=host on cgroup v2
  3. Starts the OpenShell gateway, patches the image to use iptables-legacy, and restarts
  4. Disables kube-router's network policy controller (L4T kernel lacks required ipset types)
  5. Sets up inference providers and creates the sandbox with --policy for egress control
  6. Fixes CoreDNS forwarding (same 127.0.0.11 issue as Colima)
  7. Installs Ollama for optional local inference

Key design decisions

  • Runs as normal user, not sudo. Only kernel module loading and Docker daemon config use sudo internally. This ensures gateway metadata and mTLS certs land in the user's home dir, which is required for openshell term to connect.

  • Passes --policy to sandbox create. Without this, the sandbox blocks all egress. The baseline policy pre-approves Telegram, NVIDIA API, GitHub, npm, and other required endpoints.

  • Disables kube-router network policy. L4T only ships ip_set_hash_net; kube-router requires hash:ip, hash:ipport, etc. OpenShell's application-level HTTP proxy still enforces egress policies (deny-by-default, host allowlist, method/path filtering, operator approval).

Network policy limitation

The Kubernetes NetworkPolicy enforcement layer is disabled on Jetson. What remains active:

  • Deny-by-default outbound access with explicit host allowlist
  • Per-binary restrictions (e.g., only git can reach github.com)
  • HTTP method and path filtering (e.g., docs endpoints allow GET only)
  • Operator approval workflow for unlisted hosts via openshell term
  • Filesystem read-only/read-write enforcement
  • Non-root sandbox user execution

What is missing: the k8s NetworkPolicy layer that catches traffic bypassing the HTTP proxy. This could be closed by rebuilding the L4T kernel with full ipset support, or by replacing kube-router with Calico.

Files changed

  • scripts/setup-jetson.sh — self-contained Jetson setup script
  • nemoclaw-blueprint/blueprint.yaml — adds ollama inference profile
  • docs/deployment/jetson-setup.md — Jetson setup guide
  • docs/index.md — adds Jetson page to docs navigation

Test plan

  • Tested on Jetson Orin Nano (R36.5, L4T 5.15.185-tegra, Docker 29.3, OpenShell 0.0.7)
  • Gateway starts without iptables/ipset panics
  • Sandbox reaches Ready state
  • Network policy activates (Active > 0)
  • Egress works: curl to api.telegram.org from inside sandbox
  • Telegram bot receives and responds to messages
  • Inference via NVIDIA cloud (Nemotron 3 Super 120B) works
  • openshell term connects and shows policy rules for approval
  • openshell sandbox connect works
  • Untested on Orin NX and AGX Orin (expected to work — same L4T kernel)

Summary by CodeRabbit

  • New Features

    • Automated Jetson setup and deployment flow for Orin Nano/NX/AGX devices; creates and verifies a ready sandbox.
    • Added Ollama as an optional local inference provider and selection for a Nemotron model.
  • Documentation

    • New Jetson deployment guide with prerequisites, step-by-step setup, network- and DNS-related notes, device compatibility, and troubleshooting.
  • Chores

    • Added a documentation index entry linking to the Jetson setup guide.

@hholtmann hholtmann mentioned this pull request Mar 17, 2026
@cvaisnor

Copy link
Copy Markdown

This is wicked! I was about to see if I can get this running on my Orin Nano as well. Whenever I use docker I run into a weird bug with iptable overrides being needed. Looking forward to this being supported by Nvidia and merged in. I can test it out if needed.

@wscurran

Copy link
Copy Markdown
Contributor

Great suggestion. Tagging Jetsons gauge the use case.

@ACCGAGTT

Copy link
Copy Markdown

Hello Team ,
Just an FYI i got nemoclaw working on Jetson Orin Nano Super.
Current issue with Orin Nano is the following:
the root cause is isolated to the binaries packaged inside the OpenShell Docker image, this requires a fix at the container image level


The Conflict: The OpenShell gateway container (running K3s) comes bundled with iptables v1.8.10 (nf_tables)[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)]. However, Jetson Orin Nano's kernel doesn't play nicely with the nf_tables extensions required by the container's kube-router[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)].

    The Crash: When K3s tries to set up network policies, it attempts to insert rules using the comment extension (xt_comment)[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)]. Because of the nf_tables vs legacy table mismatch between the container and your Jetson kernel, it throws the Extension comment revision 0 not supported, missing kernel module? warning and panics[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)].

Why Standard Workarounds Fail

You might be tempted to try standard host-level fixes, but they will not work for this specific issue[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)]:

    Running update-alternatives --set iptables /usr/sbin/iptables-legacy on the host doesn't help because the K3s gateway container still uses its own internal nf_tables binary[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)].

    Manually loading legacy xt_* / iptable_* kernel modules on the host doesn't resolve the container's internal networking conflict[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)].

    Blacklisting the nf_tables kernel module on your Jetson and rebooting will simply change the error[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)]. The container's kube-proxy will fail to start entirely, throwing iptables is not available on this host instead of panicking[[1](https://www.google.com/url?sa=E&q=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fgrounding-api-redirect%2FAUZIYQFBtrZCEKaabChPtEZ6i1lgEtgFzMd1aDXbIZmBNwAo7_Hsve3TSMWV7pFfalQcY_2-N0ew-tUqConDD4BBJe_LuZt_pkpbU4mgEWTdABqjOAi4fIDBELyOh-HDYk8Si4w7bd-_mDT87UIm4yxvbo8DXSku8XOKIHfvKJj0c1McMaFJlQ%3D%3D)].

In order to get nemoclaw to work on Jetson Nano we need to:

  1. Create a patch for docker
  2. Create an intercept script to block re-downloading the incompatible image

Dockerfile:
`FROM ghcr.io/nvidia/openshell/cluster:0.0.9

USER root

Attempt to use update-alternatives (if it's a Debian/Ubuntu base)

RUN update-alternatives --set iptables /usr/sbin/iptables-legacy || true &&
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy || true

Force symlinks just in case K3s is bypassing alternatives or it's an Alpine base

RUN ln -sf /usr/sbin/iptables-legacy /usr/sbin/iptables &&
ln -sf /usr/sbin/ip6tables-legacy /usr/sbin/ip6tables &&
ln -sf /usr/sbin/iptables-legacy-save /usr/sbin/iptables-save &&
ln -sf /usr/sbin/iptables-legacy-restore /usr/sbin/iptables-restore`

Intercept script:
`#!/bin/bash

If NemoClaw tries to pull the cluster image, fake a success to protect our patch

if [[ "$1" == "pull" && "$2" == "ghcr.io/nvidia/openshell/cluster:0.0.9" ]]; then
echo "Intercepted: Using local patched image instead of pulling from ghcr.io."
exit 0
fi

Otherwise, pass all other commands to the real Docker daemon

exec /usr/bin/docker "$@"`

Then run this:
docker build -t ghcr.io/nvidia/openshell/cluster:0.0.9 -f openshell_009_patch .

@markhermeling

markhermeling commented Mar 19, 2026

Copy link
Copy Markdown

Thanks for the workaround @ACCGAGTT , however that does not seem to work for me.
I have the container built locally and tagged, I have /usr/bin/docker patched to ignore any pull from ghcr.io/nvidia/openshell/cluster,

mark@orin:~/patch$ docker pull ghcr.io/nvidia/openshell/cluster:latest
Intercepted: Using local patched image instead of pulling from ghcr.io.

I tried a few other tricks, but somehow the 'openshell gateway start' still pulls a newer image. I dont think it goes through /usr/bin/docker to pull or run the image.

I changed the script to:
#!/bin/bash

new_args=()
for arg in "$@"; do
if [[ "$arg" == ghcr.io/nvidia/openshell/cluster ]]; then
new_args+=("ghcr.io/nvidia/openshell/cluster:0.0.9")
else
new_args+=("$arg")
fi
done

exec /usr/bin/docker.org "${new_args[@]}"

But that does not help either.

@ACCGAGTT

ACCGAGTT commented Mar 19, 2026

Copy link
Copy Markdown

Thanks for the workaround @ACCGAGTT , however that does not seem to work for me. I have the container built locally and tagged, I have /usr/bin/docker patched to ignore any pull from ghcr.io/nvidia/openshell/cluster,

mark@orin:~/patch$ docker pull ghcr.io/nvidia/openshell/cluster:latest Intercepted: Using local patched image instead of pulling from ghcr.io.

I tried a few other tricks, but somehow the 'openshell gateway start' still pulls a newer image. I dont think it goes through /usr/bin/docker to pull or run the image.

I changed the script to: #!/bin/bash

new_args=() for arg in "$@"; do if [[ "$arg" == ghcr.io/nvidia/openshell/cluster ]]; then new_args+=("ghcr.io/nvidia/openshell/cluster:0.0.9") else new_args+=("$arg") fi done

exec /usr/bin/docker.org "${new_args[@]}"

But that does not help either.

couple of questions:

  1. are you running on Ubuntu 22.04.5
  2. also how is your docker installed? snap or offiical repo
  3. you need to make sure you dont have the old image of openclaw/nemoclaw in docker and rm any stale containers
    docker rm -f $(docker ps -aq --filter name=openshell) or docker rm openshell-cluster-nemoclaw

@wscurran wscurran added the integration: telegram Telegram integration or channel behavior label Mar 20, 2026
@cv

cv commented Mar 21, 2026

Copy link
Copy Markdown
Collaborator

Awesome work on the Jetson support, @hholtmann — excited to see Orin Nano in the mix! Things have been moving pretty quickly around here though, and main has picked up CI checks plus a bunch of other changes since this was first submitted. When you have a moment, would you be able to rebase on top of the current main? That'll let us do a fresh review and make sure everything plays nicely together. Thanks for the contribution!

NVIDIA Jetson devices running L4T (Linux for Tegra) cannot run the
standard NemoClaw setup because OpenShell's k3s-in-Docker gateway
fails on L4T's kernel configuration. This commit adds
scripts/setup-jetson.sh, which resolves four distinct L4T
incompatibilities before delegating to the normal setup.sh for the
full OpenShell/k3s path with security intact.

Inference is routed through NVIDIA cloud (nvidia-nim) by default,
same as every other platform. Ollama is installed as an available
local fallback but no model is pulled automatically. To switch to
local inference after setup:

  ollama pull nemotron-3-nano:4b
  openshell inference set --provider vllm-local --model nemotron-3-nano:4b

## Problems and fixes

### 1. Missing kernel modules (br_netfilter, xt_comment, ipset)

L4T ships the required netfilter and bridge modules as .ko files but
does not load them at boot. Without them:

- br_netfilter: pod-to-pod and ClusterIP routing fails silently
  because bridge traffic never enters iptables.
- xt_comment: kube-router panics on startup when it cannot insert
  iptables rules with the --comment match.
- xt_conntrack, xt_mark, xt_nat, xt_MASQUERADE: kube-proxy cannot
  set up service routing rules.
- ip_set_hash_net: kube-router's network policy controller cannot
  create ipset sets for policy enforcement.

Fix: modprobe all required modules and persist them via
/etc/modules-load.d/k3s-netfilter.conf so they survive reboots.

### 2. iptables backend mismatch (nf_tables vs legacy)

The OpenShell gateway image (Ubuntu 24.04) defaults to iptables-nft
(nf_tables backend), but L4T's kernel uses iptables-legacy. The
nf_tables compatibility layer in the Tegra kernel is incomplete —
it lacks translation support for several match extensions including
xt_addrtype, which Docker itself requires for bridge networking.

Switching the host to nf_tables breaks Docker; keeping the container
on nf_tables breaks k3s. Both backends exist in the gateway image.

Fix: build a thin wrapper layer over the upstream gateway image that
runs update-alternatives to switch to iptables-legacy. The wrapper
is tagged with the same image name so openshell gateway start uses
it transparently. The upstream image layers remain intact and can be
restored with docker pull at any time.

### 3. Incomplete ipset kernel support

L4T's kernel only ships the ip_set_hash_net module. kube-router's
network policy controller requires additional ipset types (hash:ip,
hash:ipport, hash:ipportnet, hash:ipportip, bitmap:port) that are
not built into the Tegra kernel. This causes the controller to fail
on every sync cycle, and in some configurations it drops all pod
traffic by default while in a failed state.

Fix: the gateway image wrapper injects --disable-network-policy into
the k3s server arguments via an entrypoint shim. This disables
kube-router's network policy controller entirely.

**Impact on security:** this removes the Kubernetes NetworkPolicy
enforcement layer, which acts as a defense-in-depth IP/port-level
firewall for sandbox pods. However, OpenShell's application-level
policy enforcement remains fully active. This higher-level policy
provides:

- Deny-by-default outbound network access with an explicit allowlist
  of permitted hosts (NVIDIA inference APIs, GitHub, npm, etc.)
- Per-binary restrictions (e.g. only git can reach github.com)
- HTTP method and path filtering (e.g. docs endpoints allow GET only)
- Operator approval workflow for requests to unlisted hosts via the
  OpenShell TUI
- Filesystem read-only/read-write policy enforcement
- Non-root sandbox user execution

The Kubernetes NetworkPolicy layer would catch traffic that bypasses
the OpenShell proxy (e.g. raw sockets). On Jetson this gap could be
closed in the future by either rebuilding the L4T kernel with full
ipset support, or by replacing kube-router with Calico which uses
iptables directly without ipset dependencies.

### 4. CoreDNS forwarding to Docker's internal DNS

Same issue as Colima environments: k3s CoreDNS forwards to
/etc/resolv.conf inside the gateway container, which contains
127.0.0.11 (Docker's embedded DNS resolver). This address is not
reachable from k3s pods because they run in separate network
namespaces.

The gateway entrypoint already sets up a DNS proxy on the
container's routable eth0 IP, but CoreDNS is not configured to use
it. setup.sh only patches CoreDNS for Colima; Jetson has the same
issue.

Fix: after setup.sh completes, patch the CoreDNS ConfigMap to
forward to the container's DNS proxy IP and restart the CoreDNS
deployment. Bounce the sandbox pod if needed so it does not remain
in CrashLoopBackOff waiting for the exponential backoff timer.

### 5. cgroup v2 namespace (same as DGX Spark)

L4T R36+ runs Ubuntu with cgroup v2. k3s-in-Docker requires
--cgroupns=host to manage cgroup hierarchies. Same fix as
setup-spark.sh: set default-cgroupns-mode=host in Docker's
daemon.json.

## Design

The script follows the same pattern as setup-spark.sh: fix
platform-specific blockers, then delegate to setup.sh for the
standard OpenShell/k3s path. No existing files are modified.

- Autodetects Jetson via /etc/nv_tegra_release or tegra kernel string
- All fixes are gated behind Jetson detection (FORCE_JETSON=1 to
  override)
- Gateway image patch is non-destructive (docker pull restores the
  original)
- Kernel modules are persisted across reboots via modules-load.d

Tested on Jetson Orin (R36.5, L4T 5.15.185-tegra, Docker 29.3,
CUDA 12.6, OpenShell 0.0.7).
Add an ollama profile for local inference via Ollama's
OpenAI-compatible API. This enables Jetson and other edge devices
to use locally-running models (e.g. nemotron-3-nano:4b) without
requiring NVIDIA cloud credentials or a vLLM installation.

The profile uses http://host.docker.internal:11434/v1 as the
endpoint, which resolves to the host's Ollama instance from inside
the sandbox container. No API key is required (Ollama accepts any
value).

This profile is not selected by default — inference routes through
nvidia-nim (NVIDIA cloud) unless explicitly changed.
- Run setup-jetson.sh as normal user instead of sudo; only kernel module
  loading and Docker daemon config use sudo internally. This ensures
  gateway metadata and mTLS certs are stored in the user's home dir,
  which is required for `openshell term` to connect properly.

- Inline gateway/sandbox creation instead of delegating to setup.sh.
  setup.sh destroys and restarts the gateway, which re-pulls the upstream
  image and clobbers the iptables-legacy patch. The new flow: start
  gateway (pulls image) → patch image → restart gateway → create sandbox.

- Pass --policy to sandbox create so the baseline network policy
  (Telegram, NVIDIA API, GitHub, npm, etc.) is loaded at creation time.
  Without this, the sandbox blocks all egress with 403.

- Add Jetson setup documentation (docs/deployment/jetson-setup.md)
  covering prerequisites, setup steps, network policy activation,
  local inference with Ollama, and troubleshooting.

Tested on Jetson Orin Nano (R36.5, L4T 5.15.185-tegra).
- Derive gateway image tag from `openshell --version` instead of
  hardcoding 0.0.8. The CLI pulls cluster:<version> at runtime, so
  the iptables-legacy patch must target the matching tag.

- Keep nemoclaw/src/ in the Docker build context. Main switched to a
  multi-stage Dockerfile that builds TypeScript from source (3aaef13),
  so removing src/ broke the sandbox image build.

- Pre-populate network policy draft rules by triggering outbound
  connections from the sandbox to every endpoint in the policy. This
  ensures all rules are visible in `openshell term` for approval
  immediately after setup completes.

Tested on Jetson Orin Nano (R36.5, L4T 5.15.185-tegra).
@hholtmann

Copy link
Copy Markdown
Author

Rebased on latest main (04012f7) and fixed two compatibility issues introduced by upstream changes:

  1. Gateway image version mismatchopenshell gateway start now pulls cluster:0.0.13 (matching the CLI version), but the setup script hardcoded cluster:0.0.8. The iptables-legacy patch was applied to the wrong image. Fixed by deriving the tag dynamically from openshell --version.

  2. Multi-stage Dockerfile build — main switched from pre-built dist/ to building TypeScript from source in a Docker multi-stage build (3aaef13). The setup script was deleting src/ from the build context, breaking the sandbox image build.

Additionally, the setup script now pre-populates network policy draft rules by triggering outbound connections to all policy endpoints from inside the sandbox. This means all 15 rules are immediately visible in openshell term for approval after setup completes.

Note: On Jetson, kube-router's network policy controller is disabled (L4T kernel lacks required ipset types), so egress goes through OpenShell's HTTP proxy. The proxy requires manual approval of network rules via openshell term before the sandbox can reach external services (Telegram, GitHub, NVIDIA API, etc.). The setup script prints this as step 1 in the "Next steps" output.

@coderabbitai

coderabbitai Bot commented Mar 22, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 38fe7d01-11ba-44c6-b4b1-49c166e2390d

📥 Commits

Reviewing files that changed from the base of the PR and between 8c1e621 and 100da3e.

📒 Files selected for processing (1)
  • docs/index.md
✅ Files skipped from review due to trivial changes (1)
  • docs/index.md

📝 Walkthrough

Walkthrough

Adds Jetson support: a new Jetson deployment doc, a comprehensive interactive Jetson setup script (platform detection, kernel modules, Docker/cgroup adjustments, OpenShell/k3s patches, provider & sandbox setup, CoreDNS fix), and an Ollama inference profile added to the blueprint; docs index updated to link the guide.

Changes

Cohort / File(s) Summary
Documentation
docs/deployment/jetson-setup.md, docs/index.md
Add new Jetson setup guide and link it from the Deployment index; documents prerequisites, step-by-step setup, platform notes, tested devices, and troubleshooting.
Configuration / Inference Profiles
nemoclaw-blueprint/blueprint.yaml
Add ollama inference profile and include ollama in top-level profiles; config is OpenAI-compatible, points at http://host.docker.internal:11434/v1, model nemotron-3-nano:4b, uses OPENAI_API_KEY with default ollama.
Setup Automation
scripts/setup-jetson.sh
Add end-to-end Jetson setup script: Linux non-root enforcement, Jetson detection, docker-group check, kernel module load/persistence, Docker cgroup v2 fix (default-cgroupns-mode: "host"), OpenShell gateway rebuild/patch (iptables-legacy, disable kube-router network-policy), upsert inference providers (nvidia-nim, optional vllm/ollama), sandbox build/deploy, network-policy priming, and CoreDNS forwarding patch.

Sequence Diagram

sequenceDiagram
    participant User as User
    participant Script as scripts/setup-jetson.sh
    participant Host as Host OS / Docker
    participant OpenShell as OpenShell Gateway
    participant K3s as k3s Cluster
    participant Sandbox as Nemoclaw Sandbox
    participant CoreDNS as CoreDNS

    User->>Script: run setup-jetson.sh
    Script->>Host: verify tools, ensure user in `docker` group
    Script->>Host: modprobe kernel modules & persist
    Script->>Host: patch Docker daemon (cgroupns=host) & restart
    Script->>OpenShell: destroy/start gateway, patch image (iptables-legacy, disable network-policy)
    OpenShell->>K3s: gateway applies patched cluster config
    Script->>K3s: upsert inference providers (nvidia-nim, optional vllm/ollama)
    Script->>Sandbox: build image, create sandbox, wait Ready
    Script->>Sandbox: prime network-policy via openshell ssh-proxy
    Script->>CoreDNS: patch Corefile to forward to host resolver, restart CoreDNS
    Script->>User: print next-step commands (approve network-policy, connect, test)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Poem

🐰 I hopped through scripts and docs tonight,
I nudged kernels, Docker, gateways — just right.
I added providers, primed the sandbox door,
Now Jetsons chatter and agents explore.
A tiny hop, and servers purr galore.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding Jetson device support with specific mention of testing on Orin Nano. It directly reflects the primary objective of the PR.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (4)
docs/deployment/jetson-setup.md (4)

46-47: Stop using bold as emphasis/callout formatting here.

Routine emphasis like **normal user** and **one-time step** should stay plain, and the What remains active / troubleshooting labels should be plain prose or real MyST admonitions. LLM pattern detected.

As per coding guidelines, Unnecessary bold on routine instructions ("This is a **critical** step" when nothing is actually critical). Bold is reserved for UI labels, parameter names, and genuine warnings. and Use MyST admonitions (:::{tip}, :::{note}, :::{warning}) for callouts, not bold text or blockquotes.

Also applies to: 81-82, 122-131, 149-164

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 46 - 47, Remove inline bold
emphasis for routine instructions in the Jetson setup doc: replace instances
like "**normal user**" and "**one-time step**" with plain text, and convert any
callout-like text (e.g., "What remains active", troubleshooting labels) into
proper MyST admonitions (:::{note}, :::{tip}, :::{warning}) where appropriate;
update all similar occurrences called out in the review (around the shown
example and the other ranges referenced) so bold is reserved only for UI labels,
parameter names, or genuine warnings, and ensure admonitions use the correct
MyST syntax and brief descriptive headers.

28-35: Add section intros and a closing Next Steps section.

Prerequisites, Install, Connect and Test, What's Different on Jetson, Tested Devices, and Troubleshooting jump straight into lists, code blocks, or tables. The page also ends without the required Next Steps section that links onward.

As per coding guidelines, Sections use H2 and H3, each starting with an introductory sentence. and A "Next Steps" section at the bottom links to related pages.

Also applies to: 36-42, 84-94, 106-108, 139-145, 147-164

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 28 - 35, Add a one-sentence
intro for each major section heading ("Prerequisites", "Install", "Connect and
Test", "What's Different on Jetson", "Tested Devices", "Troubleshooting")
explaining the purpose of the section before the lists/tables/code blocks, and
append a new "Next Steps" H2 at the end that contains brief links to related
pages (e.g., deployment, troubleshooting, device-specific guides). Apply the
same intro-sentence change to the other mentioned blocks (lines 36-42, 84-94,
106-108, 139-145, 147-164) so every H2/H3 begins with a short explanatory
sentence and ensure the final "Next Steps" section links onward.

81-82: Use active, present-tense phrasing in these passages.

Phrases like is destroyed, are not compiled, to be pushed, and it will detect drift into passive voice or future tense for current behavior.

As per coding guidelines, Active voice required. Flag passive constructions. and Present tense. Flag future tense ("will") in descriptions of current behavior.

Also applies to: 117-120, 150-156

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 81 - 82, Update doc phrasing to
active voice and present tense: replace passive/future constructions such as "is
destroyed", "are not compiled", "to be pushed", and "it will detect" with
active, present-tense alternatives (e.g., "until you destroy the gateway" or
"until the gateway is deleted"; "do not compile", "push", "it detects"). Apply
these changes in docs/deployment/jetson-setup.md for the passages around the
current diffs (lines shown include 81-82, and also review and convert similar
wording at 117-120 and 150-156) so all descriptions read in active voice and
present tense.

23-26: Keep one sentence per source line.

Several paragraphs break one sentence and start the next on the same source line, which makes diffs harder to review.

As per coding guidelines, One sentence per line in source (makes diffs readable). Flag paragraphs where multiple sentences appear on the same line.

Also applies to: 46-47, 81-82, 98-99, 110-113, 135-137, 150-152, 155-156

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 23 - 26, The paragraph starting
with "NemoClaw runs on NVIDIA Jetson devices (Orin Nano, Orin NX, AGX Orin) with
L4T (Linux for Tegra)." and other multi-sentence lines should be reformatted so
each sentence occupies its own source line; update the Jetson setup doc to split
any lines that contain multiple sentences (including the other flagged
paragraphs) so diffs are one-sentence-per-line and retain original sentence
order and punctuation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/deployment/jetson-setup.md`:
- Around line 38-42: Update the CLI code fences to use the console language tag
and add $ prompt prefixes to each command; specifically replace the ```bash
fences around the snippet containing "git clone
https://github.com/NVIDIA/NemoClaw.git", "cd NemoClaw", and "cd nemoclaw && npm
install && npm run build && cd .." with ```console and prepend "$ " to each
line, and apply the same change to the other CLI blocks referenced (lines
containing the other bash snippets at the reported ranges).

In `@scripts/setup-jetson.sh`:
- Around line 277-284: The script currently creates the "ollama-local" provider
only when the ollama binary already exists (upsert_provider called
conditionally) and runs the optional installer under set -e which will abort on
installer failures; change the flow so the ollama provider is configured after
installation (i.e., attempt installation first, then call upsert_provider
"ollama-local" "openai" "OPENAI_API_KEY=ollama"
"OPENAI_BASE_URL=http://host.openshell.internal:11434/v1" regardless of whether
ollama was present initially) and make the installer invocation tolerate
failures (do not let curl | sudo sh abort the whole script—catch errors, emit a
warning, and continue so cloud inference remains usable); update both the ollama
check/upsert block and the later install block to implement this resilient,
post-install provider registration behavior.
- Around line 372-379: The script currently silences all SSH/proxy/curl failures
with "|| true" but still prints "info 'Draft rules generated — approve them in
'openshell term''"; remove the unconditional "|| true", run the ssh invocation
(the block using ssh with ProxyCommand and "$CURL_CMDS" redirected to /dev/null
2>&1), capture its exit status, and only emit the info message if that exit
status is zero; if the ssh command fails, emit an error (or exit non‑zero)
instead of claiming success so the user knows warm-up failed and can
troubleshoot openshell/proxy/CURL_CMDS.
- Around line 393-405: The script currently discovers the cluster container with
a fuzzy docker ps into CLUSTER; instead use the already-provided
CLUSTER_CONTAINER variable to target the exact container to avoid patching the
wrong kube cluster. Replace usage of CLUSTER assignment and any subsequent
docker exec references that use CLUSTER with CLUSTER_CONTAINER, keeping the rest
of the logic (DNS_IP, CURRENT_FWD check, and the kubectl patch call) unchanged
so the CoreDNS patch is applied only to the intended container.
- Around line 251-267: The upsert_provider function currently only checks grep's
exit code and can misreport a creation on real failures; modify upsert_provider
to capture the full output and exit status of the openshell provider create call
(e.g. output="$(openshell provider create ... 2>&1)"; rc=$?), then: if rc==0 log
"Created $name provider"; elif the captured output contains "AlreadyExists" run
openshell provider update and log "Updated $name provider"; else surface the
original error (log the output via error/info) and exit non-zero so the script
fails fast. Keep references to the existing function name upsert_provider and
the commands openshell provider create and openshell provider update.

---

Nitpick comments:
In `@docs/deployment/jetson-setup.md`:
- Around line 46-47: Remove inline bold emphasis for routine instructions in the
Jetson setup doc: replace instances like "**normal user**" and "**one-time
step**" with plain text, and convert any callout-like text (e.g., "What remains
active", troubleshooting labels) into proper MyST admonitions (:::{note},
:::{tip}, :::{warning}) where appropriate; update all similar occurrences called
out in the review (around the shown example and the other ranges referenced) so
bold is reserved only for UI labels, parameter names, or genuine warnings, and
ensure admonitions use the correct MyST syntax and brief descriptive headers.
- Around line 28-35: Add a one-sentence intro for each major section heading
("Prerequisites", "Install", "Connect and Test", "What's Different on Jetson",
"Tested Devices", "Troubleshooting") explaining the purpose of the section
before the lists/tables/code blocks, and append a new "Next Steps" H2 at the end
that contains brief links to related pages (e.g., deployment, troubleshooting,
device-specific guides). Apply the same intro-sentence change to the other
mentioned blocks (lines 36-42, 84-94, 106-108, 139-145, 147-164) so every H2/H3
begins with a short explanatory sentence and ensure the final "Next Steps"
section links onward.
- Around line 81-82: Update doc phrasing to active voice and present tense:
replace passive/future constructions such as "is destroyed", "are not compiled",
"to be pushed", and "it will detect" with active, present-tense alternatives
(e.g., "until you destroy the gateway" or "until the gateway is deleted"; "do
not compile", "push", "it detects"). Apply these changes in
docs/deployment/jetson-setup.md for the passages around the current diffs (lines
shown include 81-82, and also review and convert similar wording at 117-120 and
150-156) so all descriptions read in active voice and present tense.
- Around line 23-26: The paragraph starting with "NemoClaw runs on NVIDIA Jetson
devices (Orin Nano, Orin NX, AGX Orin) with L4T (Linux for Tegra)." and other
multi-sentence lines should be reformatted so each sentence occupies its own
source line; update the Jetson setup doc to split any lines that contain
multiple sentences (including the other flagged paragraphs) so diffs are
one-sentence-per-line and retain original sentence order and punctuation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: df07c066-1d59-4c09-8b0b-7f95a2838dd0

📥 Commits

Reviewing files that changed from the base of the PR and between 04012f7 and 3bf7566.

📒 Files selected for processing (4)
  • docs/deployment/jetson-setup.md
  • docs/index.md
  • nemoclaw-blueprint/blueprint.yaml
  • scripts/setup-jetson.sh

Comment thread docs/deployment/jetson-setup.md Outdated
Comment thread scripts/setup-jetson.sh
Comment thread scripts/setup-jetson.sh Outdated
Comment thread scripts/setup-jetson.sh
Comment thread scripts/setup-jetson.sh Outdated
- Use console fences with $ prompts in docs (docs formatter contract)
- Fail fast in upsert_provider when create fails for non-AlreadyExists
- Move ollama-local provider creation after Ollama install step;
  make Ollama install non-fatal so setup continues with cloud inference
- Guard draft-rule warm-up message on SSH success
- Use exact CLUSTER_CONTAINER name for CoreDNS patch instead of fuzzy
  docker ps match

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (6)
docs/deployment/jetson-setup.md (5)

46-47: LLM pattern detected: unnecessary bold on non-UI text.

Bold is reserved for UI labels, parameter names, and genuine warnings. "Normal user" is not a UI element.

📝 Suggested fix
-The script runs as your **normal user** (not sudo). It uses sudo internally
+The script runs as your normal user (not sudo). It uses sudo internally
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 46 - 47, Remove the unnecessary
markdown bolding around the phrase in the sentence "The script runs as your
**normal user** (not sudo)." — change it to plain text ("The script runs as your
normal user (not sudo).") so only UI labels/parameters remain bolded; update the
sentence in the docs/deployment/jetson-setup.md where that exact phrase appears.

122-131: LLM pattern detected: bold used as pseudo-headers.

Consider using proper H4 subheadings or MyST admonitions instead of bold text for "What remains active" and "What is missing" sections.

📝 Suggested restructure
-**What remains active:** OpenShell's application-level egress proxy provides:
+#### What remains active
+
+OpenShell's application-level egress proxy provides:

 - Deny-by-default outbound access with an explicit host allowlist
 - HTTP method and path filtering
 - Operator approval workflow for unlisted hosts via `openshell term`
 - Filesystem and process isolation

-**What is missing:** the Kubernetes NetworkPolicy layer that catches traffic
-bypassing the HTTP proxy (e.g., raw sockets). This gap could be closed by
-rebuilding the L4T kernel with full ipset support.
+#### What is missing
+
+The Kubernetes NetworkPolicy layer that catches traffic bypassing the HTTP proxy (e.g., raw sockets).
+This gap could be closed by rebuilding the L4T kernel with full ipset support.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 122 - 131, Replace the bold
pseudo-headers "**What remains active:**" and "**What is missing:**" with proper
Markdown/MyST constructs: convert them to H4 headings (e.g., "#### What remains
active") or wrap each section in a MyST admonition (e.g., ```::note``` or a
suitable admonition type) so the sections render as real subheadings/admonitions
instead of bold inline text; update the blocks containing the lists and the
explanatory sentence about the Kubernetes NetworkPolicy/l4t kernel to be
children of the new headings/admonitions so structure and accessibility are
improved.

81-82: LLM pattern detected: unnecessary bold for emphasis.

"One-time step" does not require bold emphasis. Bold should be reserved for UI labels, parameter names, and genuine warnings.

📝 Suggested fix
-This is a **one-time step** per gateway session. The policy remains active
+This is a one-time step per gateway session. The policy remains active
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 81 - 82, The phrase "This is a
**one-time step** per gateway session." uses unnecessary bold for emphasis; edit
the docs text (around the sentence containing "one-time step") to remove the
Markdown bold markup so it reads without emphasis (e.g., "This is a one-time
step per gateway session."), reserving bold only for UI labels, parameter names,
or true warnings elsewhere in the doc.

162-164: Missing "Next Steps" section at the bottom of the page.

The page ends abruptly after the troubleshooting section. Per the coding guidelines, every page should have a "Next Steps" section at the bottom linking to related pages.

📝 Suggested addition
## Next Steps

- [NemoClaw CLI Reference](../reference/cli.md)
- [Network Policy Configuration](../guides/network-policy.md)
- [Local Inference with Ollama](../guides/local-inference.md)

Adjust the links to match actual related pages in the documentation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 162 - 164, Add a "Next Steps"
section at the end of the docs/deployment/jetson-setup.md page (after the
troubleshooting block that includes "**`openshell term` shows nothing:**" and
the note about "setup-jetson.sh") linking to related docs; create a level-2
heading "## Next Steps" and include a short bulleted list of links to the
relevant pages (e.g., NemoClaw CLI Reference, Network Policy Configuration,
Local Inference with Ollama) and ensure the link targets match the repository's
actual doc paths.

23-26: Multiple sentences on single lines violate diff-readability guideline.

Per the coding guidelines, use one sentence per line to make diffs readable. This pattern occurs throughout the document.

📝 Example fix for this section
-NemoClaw runs on NVIDIA Jetson devices (Orin Nano, Orin NX, AGX Orin) with
-L4T (Linux for Tegra). A dedicated setup script handles L4T kernel
-incompatibilities and configures the OpenShell gateway for Jetson's
-iptables backend.
+NemoClaw runs on NVIDIA Jetson devices (Orin Nano, Orin NX, AGX Orin) with L4T (Linux for Tegra).
+A dedicated setup script handles L4T kernel incompatibilities and configures the OpenShell gateway for Jetson's iptables backend.

Apply the same pattern to other multi-sentence paragraphs (lines 46-47, 78-79, 81-82, 98-99, 110-113, 117-120, 129-131, 135-137, 150-152, 155-156, 159-160, 163-164).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/deployment/jetson-setup.md` around lines 23 - 26, Split multi-sentence
lines in docs/deployment/jetson-setup.md so each sentence occupies its own line
for diff readability; for example, break the line containing "NemoClaw runs on
NVIDIA Jetson devices (Orin Nano, Orin NX, AGX Orin) with L4T (Linux for
Tegra)." and the line mentioning "A dedicated setup script handles L4T kernel
incompatibilities and configures the OpenShell gateway for Jetson's iptables
backend." into separate single-sentence lines, then apply the same
one-sentence-per-line change to the other flagged paragraphs (those containing
phrases from lines with "OpenShell", "iptables", and the listed multi-sentence
ranges) so every sentence is on its own line.
scripts/setup-jetson.sh (1)

179-182: Consider grep -E instead of grep -oP for broader portability.

grep -oP (PCRE) may not be available on all systems. While L4T typically has GNU grep with PCRE support, a POSIX-compatible alternative would be more robust:

♻️ Suggested POSIX-compatible alternative
-OPENSHELL_VERSION=$(openshell --version 2>&1 | grep -oP '\d+\.\d+\.\d+' | head -1)
+OPENSHELL_VERSION=$(openshell --version 2>&1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/setup-jetson.sh` around lines 179 - 182, Replace the use of grep -oP
in the OPENSHELL_VERSION derivation with a POSIX-compatible extraction; update
the command that runs openshell --version (referenced by OPENSHELL_VERSION and
used to set GATEWAY_IMAGE) to use grep -E (e.g., grep -E -o with a pattern like
'([0-9]+\.){2}[0-9]+') or a sed/awk expression to capture the X.Y.Z version so
the script does not rely on PCRE-specific grep and still falls back to the
default version when no match is found.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@docs/deployment/jetson-setup.md`:
- Around line 46-47: Remove the unnecessary markdown bolding around the phrase
in the sentence "The script runs as your **normal user** (not sudo)." — change
it to plain text ("The script runs as your normal user (not sudo).") so only UI
labels/parameters remain bolded; update the sentence in the
docs/deployment/jetson-setup.md where that exact phrase appears.
- Around line 122-131: Replace the bold pseudo-headers "**What remains
active:**" and "**What is missing:**" with proper Markdown/MyST constructs:
convert them to H4 headings (e.g., "#### What remains active") or wrap each
section in a MyST admonition (e.g., ```::note``` or a suitable admonition type)
so the sections render as real subheadings/admonitions instead of bold inline
text; update the blocks containing the lists and the explanatory sentence about
the Kubernetes NetworkPolicy/l4t kernel to be children of the new
headings/admonitions so structure and accessibility are improved.
- Around line 81-82: The phrase "This is a **one-time step** per gateway
session." uses unnecessary bold for emphasis; edit the docs text (around the
sentence containing "one-time step") to remove the Markdown bold markup so it
reads without emphasis (e.g., "This is a one-time step per gateway session."),
reserving bold only for UI labels, parameter names, or true warnings elsewhere
in the doc.
- Around line 162-164: Add a "Next Steps" section at the end of the
docs/deployment/jetson-setup.md page (after the troubleshooting block that
includes "**`openshell term` shows nothing:**" and the note about
"setup-jetson.sh") linking to related docs; create a level-2 heading "## Next
Steps" and include a short bulleted list of links to the relevant pages (e.g.,
NemoClaw CLI Reference, Network Policy Configuration, Local Inference with
Ollama) and ensure the link targets match the repository's actual doc paths.
- Around line 23-26: Split multi-sentence lines in
docs/deployment/jetson-setup.md so each sentence occupies its own line for diff
readability; for example, break the line containing "NemoClaw runs on NVIDIA
Jetson devices (Orin Nano, Orin NX, AGX Orin) with L4T (Linux for Tegra)." and
the line mentioning "A dedicated setup script handles L4T kernel
incompatibilities and configures the OpenShell gateway for Jetson's iptables
backend." into separate single-sentence lines, then apply the same
one-sentence-per-line change to the other flagged paragraphs (those containing
phrases from lines with "OpenShell", "iptables", and the listed multi-sentence
ranges) so every sentence is on its own line.

In `@scripts/setup-jetson.sh`:
- Around line 179-182: Replace the use of grep -oP in the OPENSHELL_VERSION
derivation with a POSIX-compatible extraction; update the command that runs
openshell --version (referenced by OPENSHELL_VERSION and used to set
GATEWAY_IMAGE) to use grep -E (e.g., grep -E -o with a pattern like
'([0-9]+\.){2}[0-9]+') or a sed/awk expression to capture the X.Y.Z version so
the script does not rely on PCRE-specific grep and still falls back to the
default version when no match is found.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a7f92da0-8f1f-4d77-b810-3013f7a611a3

📥 Commits

Reviewing files that changed from the base of the PR and between 3bf7566 and 2648f3e.

📒 Files selected for processing (2)
  • docs/deployment/jetson-setup.md
  • scripts/setup-jetson.sh

@hholtmann

Copy link
Copy Markdown
Author

Addressed all code review feedback:

  • Docs: switched CLI code blocks to console fences with $ prompts
  • upsert_provider: captures exit code and fails fast on non-AlreadyExists errors instead of silently falling through
  • Ollama ordering: moved ollama-local provider creation to after Ollama installation; made install step non-fatal so setup continues with cloud inference if it fails
  • Draft rule warm-up: success message now guarded on SSH exit code; prints a warning on failure instead of false success
  • CoreDNS patch: uses exact $CLUSTER_CONTAINER (openshell-cluster-nemoclaw) instead of fuzzy docker ps match

Tested end-to-end on Jetson Orin Nano (R36.5).

@ACCGAGTT

ACCGAGTT commented Mar 22, 2026

Copy link
Copy Markdown

Addressed all code review feedback:

  • Docs: switched CLI code blocks to console fences with $ prompts
  • upsert_provider: captures exit code and fails fast on non-AlreadyExists errors instead of silently falling through
  • Ollama ordering: moved ollama-local provider creation to after Ollama installation; made install step non-fatal so setup continues with cloud inference if it fails
  • Draft rule warm-up: success message now guarded on SSH exit code; prints a warning on failure instead of false success
  • CoreDNS patch: uses exact $CLUSTER_CONTAINER (openshell-cluster-nemoclaw) instead of fuzzy docker ps match

Tested end-to-end on Jetson Orin Nano (R36.5).

has this already been merged and updated?
just uninstalled my nemoclaw and reinstalled but its still seems to be pulling the wrong openclaw version
Screenshot_20260322-093824.png

@hholtmann

Copy link
Copy Markdown
Author

Addressed all code review feedback:

  • Docs: switched CLI code blocks to console fences with $ prompts
  • upsert_provider: captures exit code and fails fast on non-AlreadyExists errors instead of silently falling through
  • Ollama ordering: moved ollama-local provider creation to after Ollama installation; made install step non-fatal so setup continues with cloud inference if it fails
  • Draft rule warm-up: success message now guarded on SSH exit code; prints a warning on failure instead of false success
  • CoreDNS patch: uses exact $CLUSTER_CONTAINER (openshell-cluster-nemoclaw) instead of fuzzy docker ps match

Tested end-to-end on Jetson Orin Nano (R36.5).

has this already been merged and updated? just uninstalled my nemoclaw and reinstalled but its still seems to be pulling the wrong openclaw version Screenshot_20260322-093824.png

It's not merged, but you can try my branch on which this PR is baed on: https://github.com/hholtmann/NemoClaw/tree/jetson-support

@cvaisnor

cvaisnor commented Apr 3, 2026

Copy link
Copy Markdown

Wanted to share this if anyone here is interested. Haven't tried your branch yet @hholtmann, will try to do soon.

IMG_0021

@cv

cv commented Apr 6, 2026

Copy link
Copy Markdown
Collaborator

Wanted to share this if anyone here is interested. Haven't tried your branch yet @hholtmann, will try to do soon.

That looks adorable

@wscurran

Copy link
Copy Markdown
Contributor

Thanks for this — Jetson device support is on our radar, and we appreciate the Orin Nano testing. We're currently working through our integration evaluation process before committing to a merge path for device integrations, and there's also a related implementation in #405 that we'll be reviewing alongside this one.

We'll follow up here once we have a clearer picture on direction. No action needed from you right now — we'll reach out if we need more information.

@wscurran wscurran mentioned this pull request Apr 21, 2026
9 tasks
@ericksoa

ericksoa commented May 1, 2026

Copy link
Copy Markdown
Contributor

Thanks for putting this together and for the early Orin Nano validation.

We are going to close this PR as superseded. Since this was opened, Jetson support has moved forward through a different path:

There is also a newer active Jetson implementation thread in #405 for remaining Jetson-specific behavior.

Thanks again for the contribution — this helped validate the direction and several of the platform issues we needed to address.

@ericksoa ericksoa closed this May 1, 2026
@wscurran wscurran added area: install Install, setup, prerequisites, or uninstall flow area: integrations Third-party service integration behavior area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow feature PR adds or expands user-visible functionality platform: jetson Affects Jetson AGX Thor or Orin area: docs Documentation, examples, guides, or docs build and removed priority: medium labels Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: docs Documentation, examples, guides, or docs build area: install Install, setup, prerequisites, or uninstall flow area: integrations Third-party service integration behavior area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow feature PR adds or expands user-visible functionality integration: telegram Telegram integration or channel behavior platform: jetson Affects Jetson AGX Thor or Orin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants