nvidia/jetson-headless-mode
Plan and apply safe Jetson headless-mode changes to reclaim GUI and daemon memory.
npx skills add https://github.com/NVIDIA/skills --skill jetson-headless-mode
Plan-then-apply for safe, reversible user-space memory reclamation: switch the default systemd target away from graphical.target and disable a curated set of non-essential daemons. This is the highest-yield, lowest-risk memory win on Jetson.
Build a user-approved headless-mode plan from live audit data, then apply only safe, reversible user-space changes that reduce desktop and daemon memory use on Jetson.
jetson-memory-audit shows default_systemd_target=graphical.target or shows gdm3 / lightdm / sddm active on a system the user describes as headless.jetson-memory-audit for a read-only view and suggest non-GUI memory options instead.jetson-memory-audit first, or ask the user for its output, before proposing changes or estimating savings.Use live device data as the source of truth. Jetson family, SKU/variant, memory totals, active display services, and savings estimates must come from jetson-diagnostic/scripts/detect_jetson.sh, audit.json, or a fresh jetson-memory-audit run. If a value is not available, say it is unknown instead of guessing. The savings numbers below are upper bounds; the real delta is whatever a before/after audit reports.
jetson-memory-audit JSON snapshot.sudo and explicit user approval; dry-run first unless approval was already given in the same prompt.| Script | Purpose | Arguments |
|--------|---------|-----------|
| scripts/plan.sh | Reads a memory audit JSON and emits a plan containing safe, reversible recommendations. | --audit PATH or --audit -, plus --human. |
| scripts/apply.sh | Prints or applies the safe commands from a plan JSON. Dry-run by default. | --plan PATH or --plan -, --apply, --reboot, --drop-caches. |
If your agent runtime supports run_script, use it to run scripts/plan.sh and scripts/apply.sh and summarize the returned output. Otherwise run the scripts with bash from the repository root.
scripts/plan.sh to read audit.json (from jetson-memory-audit) and emit a plan with only safety: safe knobs (target switch, display managers, audio, print, modem, etc.).scripts/apply.sh --plan plan.json for a dry run. Re-run with --apply to execute. Add --drop-caches to flush the page cache afterward, or --reboot to take effect immediately.jetson-memory-audit/scripts/audit.sh to verify the actual delta.Use the scripts for estimates and application so recommendations are based on the current device state rather than the static upper-bound table alone.
scripts/plan.sh --audit <audit.json> and report estimated_total_savings_mb, the top recommendations[*].knob, and whether any display manager or graphical.target is active. Do not run apply.sh.scripts/apply.sh --plan <plan.json> once as a dry run first. If the user has already approved mutation in the same prompt, re-run the same command with --apply and mention the reversible command(s).bash {baseDir}/scripts/<script-name> .... Do not try to chmod installed skill files.plan.sh emits the same JSON shape as jetson-inference-mem-tune/scripts/recommend.py: an array of recommendations with {layer, knob, estimated_savings_mb, safety, command, reversible_command, rationale}.apply.sh filters entries to safety == "safe" with a non-empty command, then re-checks the filtered safety marker in the shell loop before execution. Anything else, such as kernel command-line changes, device-tree changes, or accuracy tradeoffs, is out of scope for this skill.--apply is required to mutate the system.| Knob | Action | Estimated savings | Reversible? |
|---------------------------------|----------------------------------------------|-------------------|-------------|
| disable-graphical-target | systemctl set-default multi-user.target | up to 865 MB | yes |
| stop-gdm3 / gdm / lightdm / sddm / display-manager | systemctl disable --now <svc> | ~200 MB / svc | yes |
| stop-pulseaudio | disable audio daemon | ~8 MB | yes |
| stop-bluetooth | disable Bluetooth stack | ~6 MB | yes |
| stop-ModemManager | disable WWAN manager | ~4 MB | yes |
| stop-cups / stop-cups-browsed | disable print stack | ~5 / ~3 MB | yes |
| stop-snapd | disable Snap daemon | ~30 MB | yes |
| stop-whoopsie / kerneloops | disable crash reporters | ~4 / ~2 MB | yes |
| stop-avahi-daemon | disable mDNS | ~3 MB | yes |
| stop-unattended-upgrades / packagekit | disable background package work | ~6 / ~8 MB | yes |
nvargus-daemon — required for any libargus camera pipeline.nvgetty.service — serial console; disabling can lock you out of recovery.nvpmodel — power-mode service; required for clock/power tuning.containerd / docker — leave on if you run containers (most inference workloads do).nvfb / nvdisplay-related kernel services — tied to boot-time display configuration, so this skill does not change them./boot/extlinux/extlinux.conf, the device tree, or boot-time memory reservations.reversible_command. Re-running the plan with the reverts is sufficient to restore.--apply is the only way to mutate.The same set of knobs applies to every Jetson family in the matrix above. The script reads JETSON_GENERATION / JETSON_PRODUCT_LINE / JETSON_VARIANT from jetson-diagnostic/scripts/detect_jetson.sh (and still exports legacy JETSON_SKU) so the agent can attribute the savings correctly in its summary, but it does not branch on product line.
Take nvidia/jetson-headless-mode from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.