Jetson Headless Mode Plan-then-apply for safe, reversible user-space memory reclamation: switch the default systemd target away from and disable a curated set of non-essential daemons. This is the highest-yield, lowest-risk memory win on Jetson. Purpose 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. When to use - "Free as much memory as possible — I don't need the GUI." - "I'm shipping this Jetson as an inference appliance / edge node." - After shows or shows / / active on…

\\t' read -r cmd knob savings safety; do\n if [ \"$safety\" != \"safe\" ]; then\n echo \"WARN: skipping recommendation without safety=safe for knob '$knob'.\" >&2\n continue\n fi\n echo \"+ $cmd # $knob (~${savings} MB)\"\n if run_allowed_cmd \"$cmd\"; then\n continue\n else\n rc=$?\n fi\n if [ \"$rc\" -eq 64 ]; then\n echo \"WARN: skipping unsupported command for knob '$knob': $cmd\" >&2\n else\n echo \"WARN: command failed for knob '$knob'. Continuing.\" >&2\n fi\ndone\n\necho\nif [ \"$DO_REBOOT\" -eq 1 ]; then\n echo \"Rebooting in 5 seconds...\"\n sleep 5\n sudo systemctl reboot\nelse\n echo \"Done. Some changes (e.g. default systemd target) only take effect after reboot.\"\n if [ \"$DROP_CACHES\" -eq 1 ]; then\n echo\n echo \"Flushing page cache so freed memory shows up immediately...\"\n sudo sync && sudo sysctl -w vm.drop_caches=3 >/dev/null\n echo \"Done. Run jetson-memory-audit/scripts/audit.sh to verify the delta.\"\n else\n echo \"Tip: pass --drop-caches to flush reclaimable page cache so 'free -h' reflects the new baseline.\"\n fi\nfi\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":5873,"content_sha256":"b9ec376364997fa2b5ad7a76f540087b1ccc90262a4220fbf06c05611e489347"},{"filename":"scripts/plan.sh","content":"#!/usr/bin/env bash\n# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# plan.sh\n#\n# Build a \"headless mode\" plan from a jetson-memory-audit JSON. Emits the same\n# JSON shape as recommend.py: an array of {layer, knob, estimated_savings_mb,\n# safety, command, reversible_command, rationale, reference, notes}.\n#\n# Only safety=\"safe\" entries are produced; apply.sh refuses to run anything else.\n#\n# Usage:\n# plan.sh --audit PATH # PATH to audit JSON, or '-' for stdin\n# plan.sh --audit - --human # pretty-print\n#\n# Exit codes:\n# 0 ok\n# 2 audit JSON missing or malformed\n\nset -uo pipefail\n\nAUDIT=\"\"\nHUMAN=0\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nSKILLS_ROOT=\"$(cd \"$SCRIPT_DIR/../..\" && pwd)\"\n# shellcheck source=../../jetson-diagnostic/scripts/common.sh\n# shellcheck disable=SC1091\n. \"$SKILLS_ROOT/jetson-diagnostic/scripts/common.sh\"\n\nwhile [ $# -gt 0 ]; do\n case \"$1\" in\n --audit) need_value \"$@\"; AUDIT=\"$2\"; shift 2 ;;\n --human) HUMAN=1; shift ;;\n -h|--help) grep '^#' \"$0\" | sed 's/^# \\{0,1\\}//'; exit 0 ;;\n *) echo \"unknown flag: $1\" >&2; exit 64 ;;\n esac\ndone\n\nif [ -z \"$AUDIT\" ]; then\n echo \"ERROR: --audit is required (path to audit JSON, or '-')\" >&2\n exit 64\nfi\n\n# shellcheck source=../../jetson-diagnostic/scripts/detect_jetson.sh\n# shellcheck disable=SC1091\n. \"$SKILLS_ROOT/jetson-diagnostic/scripts/detect_jetson.sh\"\n\nTMP=$(mktemp)\ntrap 'rm -f \"$TMP\"' EXIT\nif [ \"$AUDIT\" = \"-\" ]; then\n cat > \"$TMP\" || { echo \"ERROR: failed to read audit JSON from stdin\" >&2; exit 2; }\nelse\n [ -r \"$AUDIT\" ] || { echo \"ERROR: cannot read audit file: $AUDIT\" >&2; exit 2; }\n cp \"$AUDIT\" \"$TMP\" || { echo \"ERROR: failed to read audit file: $AUDIT\" >&2; exit 2; }\nfi\n\nPRETTY=\"$HUMAN\" AUDIT_PATH=\"$TMP\" python3 \u003c\u003c'PY'\nimport json, os, sys\n\ntry:\n with open(os.environ[\"AUDIT_PATH\"], \"r\", encoding=\"utf-8\") as f:\n audit = json.load(f)\nexcept (OSError, json.JSONDecodeError) as e:\n print(f\"ERROR: failed to read audit JSON: {e}\", file=sys.stderr)\n sys.exit(2)\n\ntarget = audit.get(\"default_systemd_target\", \"unknown\")\nservices = audit.get(\"candidate_services\", {})\n\ndef is_active(svc):\n return services.get(svc, {}).get(\"active\") == \"active\"\n\nREF = \"SKILL.md\"\nrecs = []\n\nif target == \"graphical.target\":\n recs.append({\n \"layer\": 1,\n \"knob\": \"disable-graphical-target\",\n \"estimated_savings_mb\": 865,\n \"safety\": \"safe\",\n \"rationale\": \"Default boot target is graphical.target. Switching to multi-user.target stops the display manager and Xorg/Wayland stack on next boot.\",\n \"reference\": REF,\n \"command\": \"sudo systemctl set-default multi-user.target\",\n \"reversible_command\": \"sudo systemctl set-default graphical.target\",\n \"notes\": [\"Reboot required to fully reclaim memory.\"],\n })\n\nfor svc in (\"gdm3\", \"gdm\", \"lightdm\", \"sddm\", \"display-manager\"):\n if is_active(svc):\n recs.append({\n \"layer\": 1,\n \"knob\": f\"stop-{svc}\",\n \"estimated_savings_mb\": 200,\n \"safety\": \"safe\",\n \"rationale\": f\"Display manager {svc} is active; not needed in headless deployments.\",\n \"reference\": REF,\n \"command\": f\"sudo systemctl disable --now {svc}\",\n \"reversible_command\": f\"sudo systemctl enable --now {svc}\",\n \"notes\": [],\n })\n\naux = {\n \"pulseaudio\": (\"Audio daemon; disable if no audio I/O is needed.\", 8),\n \"bluetooth\": (\"Bluetooth stack; disable on wired-only deployments.\", 6),\n \"ModemManager\": (\"Cellular modem manager; disable if no WWAN.\", 4),\n \"cups\": (\"Print server; almost never needed on edge.\", 5),\n \"cups-browsed\": (\"CUPS browse helper; same as above.\", 3),\n \"snapd\": (\"Snap package daemon; disable if you don't ship snaps.\", 30),\n \"whoopsie\": (\"Ubuntu crash reporter; disable on production.\", 4),\n \"kerneloops\": (\"Kernel oops reporter; disable on production.\", 2),\n \"avahi-daemon\": (\"mDNS responder; disable if not used.\", 3),\n \"unattended-upgrades\": (\"Auto-update daemon; disable on locked production builds.\", 6),\n \"packagekit\": (\"Background package indexer; disable on production.\", 8),\n}\nfor svc, (reason, mb) in aux.items():\n if is_active(svc):\n recs.append({\n \"layer\": 2,\n \"knob\": f\"stop-{svc}\",\n \"estimated_savings_mb\": mb,\n \"safety\": \"safe\",\n \"rationale\": reason,\n \"reference\": REF,\n \"command\": f\"sudo systemctl disable --now {svc}\",\n \"reversible_command\": f\"sudo systemctl enable --now {svc}\",\n \"notes\": [],\n })\n\nout = {\n \"sku\": audit.get(\"sku\", \"unknown\"),\n \"variant\": audit.get(\"variant\", \"unknown\"),\n \"mem_total_gb\": audit.get(\"mem_total_gb\", 0),\n \"l4t_version\": audit.get(\"l4t_version\", \"unknown\"),\n \"product_model\": audit.get(\"product_model\", \"\"),\n \"use_case\": \"headless\",\n \"estimated_total_savings_mb\": sum(max(r[\"estimated_savings_mb\"], 0) for r in recs),\n \"recommendations\": recs,\n}\nindent = 2 if os.environ.get(\"PRETTY\") == \"1\" else None\njson.dump(out, sys.stdout, indent=indent)\nsys.stdout.write(\"\\n\")\nPY\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":5270,"content_sha256":"37fc2b91ca796f340b9e5081532f4b0fcf2ba5c2ff68e8ad7b81f983393b7e2e"},{"filename":"skill-card.md","content":"## Description: \u003cbr>\nPlan and apply safe Jetson headless-mode changes to reclaim GUI and daemon memory. \u003cbr>\n\nThis skill is ready for commercial/non-commercial use. \u003cbr>\n\n## Owner\nNVIDIA \u003cbr>\n\n### License/Terms of Use: \u003cbr>\nCC-BY-4.0 AND Apache 2.0 \u003cbr>\n## Use Case: \u003cbr>\nDevelopers and engineers converting NVIDIA Jetson devices into headless inference appliances or edge nodes by safely disabling the desktop environment and non-essential daemons to reclaim memory. \u003cbr>\n\n### Deployment Geography for Use: \u003cbr>\nGlobal \u003cbr>\n\n## Known Risks and Mitigations: \u003cbr>\nRisk: Review before execution as proposals could introduce incorrect or misleading guidance into skills. \u003cbr>\nMitigation: Review and scan skill before deployment. \u003cbr>\n\n## Reference(s): \u003cbr>\n- [Agent Skills](https://agentskills.io/) \u003cbr>\n- [jetson-bsp-skills](https://github.com/NVIDIA-AI-IOT/jetson-bsp-skills) \u003cbr>\n\n\n## Skill Output: \u003cbr>\n**Output Type(s):** [Shell commands, Configuration instructions] \u003cbr>\n**Output Format:** [JSON plan with inline bash commands] \u003cbr>\n**Output Parameters:** [1D] \u003cbr>\n**Other Properties Related to Output:** [Dry-run by default; --apply flag required for mutation] \u003cbr>\n\n## Evaluation Agents Used: \u003cbr>\n- Claude Code (`claude-code`) \u003cbr>\n- Codex (`codex`) \u003cbr>\n\n\n\n## Evaluation Tasks: \u003cbr>\nEvaluated against 8 evaluation tasks in the astra-sandbox environment using the NVSkills-Eval external profile. \u003cbr>\n\n## Evaluation Metrics Used: \u003cbr>\nReported benchmark dimensions: \u003cbr>\n- Security: Checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access. \u003cbr>\n- Correctness: Checks whether the agent follows the expected workflow and produces the correct final output. \u003cbr>\n- Discoverability: Checks whether the agent loads the skill when relevant and avoids using it when irrelevant. \u003cbr>\n- Effectiveness: Checks whether the agent performs measurably better with the skill than without it. \u003cbr>\n- Efficiency: Checks whether the agent uses fewer tokens and avoids redundant work. \u003cbr>\n\nUnderlying evaluation signals used in this run: \u003cbr>\n- `security`: Checks for unsafe operations, secret leakage, and unauthorized access. \u003cbr>\n- `skill_execution`: Verifies that the agent loaded the expected skill and workflow. \u003cbr>\n- `skill_efficiency`: Checks routing quality, decoy avoidance, and redundant tool usage. \u003cbr>\n- `accuracy`: Grades final-answer correctness against the reference answer. \u003cbr>\n- `goal_accuracy`: Checks whether the overall user task completed successfully. \u003cbr>\n- `behavior_check`: Verifies expected behavior steps, including safety expectations. \u003cbr>\n- `token_efficiency`: Compares token usage with and without the skill. \u003cbr>\n\n\n\n## Evaluation Results: \u003cbr>\n| Dimension | Num | `claude-code` | `codex` |\n|---|---:|---:|---:|\n| Security | 4 | 100% (+0%) | 100% (+0%) |\n| Correctness | 4 | 87% (+52%) | 84% (+37%) |\n| Discoverability | 4 | 89% (+43%) | 78% (+28%) |\n| Effectiveness | 4 | 61% (+34%) | 51% (+20%) |\n| Efficiency | 4 | 75% (+19%) | 67% (+18%) |\n\n## Skill Version(s): \u003cbr>\n0.0.1 (source: frontmatter) \u003cbr>\n\n## Ethical Considerations: \u003cbr>\nNVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal team to ensure this skill meets requirements for the relevant industry and use case and addresses unforeseen product misuse. \u003cbr>\n\n(For Release on NVIDIA Platforms Only) \u003cbr>\nPlease report quality, risk, security vulnerabilities or NVIDIA AI Concerns [here](https://app.intigriti.com/programs/nvidia/nvidiavdp/detail). \u003cbr>\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":3732,"content_sha256":"d55980357b7aaad07d0b6ecc89b6cb71dcbcbf901d652aa544ecad44a4e9acf2"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Jetson Headless Mode","type":"text"}]},{"type":"paragraph","content":[{"text":"Plan-then-apply for safe, reversible user-space memory reclamation: switch the default systemd target away from ","type":"text"},{"text":"graphical.target","type":"text","marks":[{"type":"code_inline"}]},{"text":" and disable a curated set of non-essential daemons. This is the highest-yield, lowest-risk memory win on Jetson.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Purpose","type":"text"}]},{"type":"paragraph","content":[{"text":"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.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to use","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Free as much memory as possible — I don't need the GUI.\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"I'm shipping this Jetson as an inference appliance / edge node.\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After ","type":"text"},{"text":"jetson-memory-audit","type":"text","marks":[{"type":"code_inline"}]},{"text":" shows ","type":"text"},{"text":"default_systemd_target=graphical.target","type":"text","marks":[{"type":"code_inline"}]},{"text":" or shows ","type":"text"},{"text":"gdm3","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"lightdm","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"sddm","type":"text","marks":[{"type":"code_inline"}]},{"text":" active on a system the user describes as headless.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When NOT to use","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The user needs the local desktop, display output, kiosk UI, or any X/Wayland session. In that case, do not recommend disabling the graphical target or display manager; use ","type":"text"},{"text":"jetson-memory-audit","type":"text","marks":[{"type":"code_inline"}]},{"text":" for a read-only view and suggest non-GUI memory options instead.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"You do not have current audit data. Run ","type":"text"},{"text":"jetson-memory-audit","type":"text","marks":[{"type":"code_inline"}]},{"text":" first, or ask the user for its output, before proposing changes or estimating savings.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Use live device data as the source of truth. Jetson family, SKU/variant, memory totals, active display services, and savings estimates must come from ","type":"text"},{"text":"jetson-diagnostic/scripts/detect_jetson.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"audit.json","type":"text","marks":[{"type":"code_inline"}]},{"text":", or a fresh ","type":"text"},{"text":"jetson-memory-audit","type":"text","marks":[{"type":"code_inline"}]},{"text":" 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.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Prerequisites","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Start from a current ","type":"text"},{"text":"jetson-memory-audit","type":"text","marks":[{"type":"code_inline"}]},{"text":" JSON snapshot.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Confirm the user does not need the local desktop, display output, kiosk UI, or X/Wayland session.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mutating changes require ","type":"text"},{"text":"sudo","type":"text","marks":[{"type":"code_inline"}]},{"text":" and explicit user approval; dry-run first unless approval was already given in the same prompt.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run on the Jetson host or in a host-visible sandbox with access to systemd state.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Available Scripts","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Script","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purpose","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Arguments","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/plan.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reads a memory audit JSON and emits a plan containing safe, reversible recommendations.","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--audit PATH","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"--audit -","type":"text","marks":[{"type":"code_inline"}]},{"text":", plus ","type":"text"},{"text":"--human","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/apply.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Prints or applies the safe commands from a plan JSON. Dry-run by default.","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--plan PATH","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"--plan -","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--apply","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--reboot","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--drop-caches","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"If your agent runtime supports ","type":"text"},{"text":"run_script","type":"text","marks":[{"type":"code_inline"}]},{"text":", use it to run ","type":"text"},{"text":"scripts/plan.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"scripts/apply.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" and summarize the returned output. Otherwise run the scripts with ","type":"text"},{"text":"bash","type":"text","marks":[{"type":"code_inline"}]},{"text":" from the repository root.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Instructions","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run ","type":"text"},{"text":"scripts/plan.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" to read ","type":"text"},{"text":"audit.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (from ","type":"text"},{"text":"jetson-memory-audit","type":"text","marks":[{"type":"code_inline"}]},{"text":") and emit a plan with only ","type":"text"},{"text":"safety: safe","type":"text","marks":[{"type":"code_inline"}]},{"text":" knobs (target switch, display managers, audio, print, modem, etc.).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Show the plan to the user and confirm.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run ","type":"text"},{"text":"scripts/apply.sh --plan plan.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" for a ","type":"text"},{"text":"dry run","type":"text","marks":[{"type":"strong"}]},{"text":". Re-run with ","type":"text"},{"text":"--apply","type":"text","marks":[{"type":"code_inline"}]},{"text":" to execute. Add ","type":"text"},{"text":"--drop-caches","type":"text","marks":[{"type":"code_inline"}]},{"text":" to flush the page cache afterward, or ","type":"text"},{"text":"--reboot","type":"text","marks":[{"type":"code_inline"}]},{"text":" to take effect immediately.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-run ","type":"text"},{"text":"jetson-memory-audit/scripts/audit.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" to verify the actual delta.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Expected workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the scripts for estimates and application so recommendations are based on the current device state rather than the static upper-bound table alone.","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For \"what would headless save\", \"estimate\", \"plan\", or production planning prompts, run ","type":"text"},{"text":"scripts/plan.sh --audit \u003caudit.json>","type":"text","marks":[{"type":"code_inline"}]},{"text":" and report ","type":"text"},{"text":"estimated_total_savings_mb","type":"text","marks":[{"type":"code_inline"}]},{"text":", the top ","type":"text"},{"text":"recommendations[*].knob","type":"text","marks":[{"type":"code_inline"}]},{"text":", and whether any display manager or ","type":"text"},{"text":"graphical.target","type":"text","marks":[{"type":"code_inline"}]},{"text":" is active. Do not run ","type":"text"},{"text":"apply.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For prompts where the user explicitly says to apply headless mode now, run ","type":"text"},{"text":"scripts/apply.sh --plan \u003cplan.json>","type":"text","marks":[{"type":"code_inline"}]},{"text":" once as a dry run first. If the user has already approved mutation in the same prompt, re-run the same command with ","type":"text"},{"text":"--apply","type":"text","marks":[{"type":"code_inline"}]},{"text":" and mention the reversible command(s).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If direct execution fails in an agent runtime, invoke scripts with ","type":"text"},{"text":"bash {baseDir}/scripts/\u003cscript-name> ...","type":"text","marks":[{"type":"code_inline"}]},{"text":". Do not try to ","type":"text"},{"text":"chmod","type":"text","marks":[{"type":"code_inline"}]},{"text":" installed skill files.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Plan / apply contract","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"plan.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" emits the same JSON shape as ","type":"text"},{"text":"jetson-inference-mem-tune/scripts/recommend.py","type":"text","marks":[{"type":"code_inline"}]},{"text":": an array of ","type":"text"},{"text":"recommendations","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"{layer, knob, estimated_savings_mb, safety, command, reversible_command, rationale}","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"apply.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" filters entries to ","type":"text"},{"text":"safety == \"safe\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" with a non-empty ","type":"text"},{"text":"command","type":"text","marks":[{"type":"code_inline"}]},{"text":", 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.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Default mode is ","type":"text"},{"text":"dry-run","type":"text","marks":[{"type":"strong"}]},{"text":". ","type":"text"},{"text":"--apply","type":"text","marks":[{"type":"code_inline"}]},{"text":" is required to mutate the system.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Knobs covered","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Knob","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Action","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Estimated savings","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reversible?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable-graphical-target","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"systemctl set-default multi-user.target","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"up to 865 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-gdm3","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"gdm","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"lightdm","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"sddm","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"display-manager","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"systemctl disable --now \u003csvc>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~200 MB / svc","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-pulseaudio","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable audio daemon","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~8 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-bluetooth","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable Bluetooth stack","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~6 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-ModemManager","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable WWAN manager","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~4 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-cups","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"stop-cups-browsed","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable print stack","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~5 / ~3 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-snapd","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable Snap daemon","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~30 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-whoopsie","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"kerneloops","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable crash reporters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~4 / ~2 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-avahi-daemon","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable mDNS","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~3 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stop-unattended-upgrades","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"packagekit","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"disable background package work","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~6 / ~8 MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yes","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Do NOT disable these services","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"nvargus-daemon","type":"text","marks":[{"type":"code_inline"}]},{"text":" — required for any libargus camera pipeline.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"nvgetty.service","type":"text","marks":[{"type":"code_inline"}]},{"text":" — serial console; disabling can lock you out of recovery.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"nvpmodel","type":"text","marks":[{"type":"code_inline"}]},{"text":" — power-mode service; required for clock/power tuning.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"containerd","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"docker","type":"text","marks":[{"type":"code_inline"}]},{"text":" — leave on if you run containers (most inference workloads do).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"nvfb","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"nvdisplay","type":"text","marks":[{"type":"code_inline"}]},{"text":"-related kernel services — tied to boot-time display configuration, so this skill does not change them.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Safety","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Does not edit ","type":"text"},{"text":"/boot/extlinux/extlinux.conf","type":"text","marks":[{"type":"code_inline"}]},{"text":", the device tree, or boot-time memory reservations.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Does not disable services it does not have an explicit entry for (no blanket \"disable everything not whitelisted\").","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Every applied change has a documented ","type":"text"},{"text":"reversible_command","type":"text","marks":[{"type":"code_inline"}]},{"text":". Re-running the plan with the reverts is sufficient to restore.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dry-run by default. ","type":"text"},{"text":"--apply","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the only way to mutate.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report only device facts and savings figures that came from live detection or audit output.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Cross-platform behavior","type":"text"}]},{"type":"paragraph","content":[{"text":"The same set of knobs applies to every Jetson family in the matrix above. The script reads ","type":"text"},{"text":"JETSON_GENERATION","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"JETSON_PRODUCT_LINE","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"JETSON_VARIANT","type":"text","marks":[{"type":"code_inline"}]},{"text":" from ","type":"text"},{"text":"jetson-diagnostic/scripts/detect_jetson.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" (and still exports legacy ","type":"text"},{"text":"JETSON_SKU","type":"text","marks":[{"type":"code_inline"}]},{"text":") so the agent can attribute the savings correctly in its summary, but it does not branch on product line.","type":"text"}]}]},"metadata":{"date":"2026-11-02","name":"jetson-headless-mode","tags":["jetson","headless","memory"],"author":"@skillopedia","source":{"stars":3825,"repo_name":"skills","origin_url":"https://github.com/NVIDIA/skills/blob/HEAD/skills/jetson-headless-mode/SKILL.md","repo_owner":"NVIDIA","body_sha256":"91f2f17fb9e54aaceb6e1e876292e8f7182483715a120ff8f68992c96b281cb8","cluster_key":"55e2016cfca1af67e704c9dfdad3a27ccc2cef6e79f5317f0625b05940f6f70b","clean_bundle":{"format":"clean-skill-bundle-v1","source":"NVIDIA/skills/skills/jetson-headless-mode/SKILL.md","text_bytes":24779,"source_commit":"25340619336e89bcc40365c28bfe9e790430468e","skills_sh_rank":11615,"attachment_count":5,"text_attachments":5,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/jetson-headless-mode/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"0.0.1","category":"devops-infrastructure","category_label":"DevOps"},"exact_dupes_collapsed_into_this":0},"license":"Apache-2.0","version":"0.0.1","category":"devops-infrastructure","metadata":{"tags":["jetson","headless","memory"],"author":"Jetson Team","languages":["bash"],"data-classification":"public"},"import_tag":"skills-sh-top20k-2026-11","description":"Plan and apply safe Jetson headless-mode changes to reclaim GUI and daemon memory."}},"renderedAt":1793671629148}

Jetson Headless Mode Plan-then-apply for safe, reversible user-space memory reclamation: switch the default systemd target away from and disable a curated set of non-essential daemons. This is the highest-yield, lowest-risk memory win on Jetson. Purpose 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. When to use - "Free as much memory as possible — I don't need the GUI." - "I'm shipping this Jetson as an inference appliance / edge node." - After shows or shows / / active on…