Jetson Headless Mode
NVIDIAOfficialCreated by Jetson TeamDistributed by NVIDIA
- Skill
- Workflow
- Cloud and DevOps
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured, reversible workflow to transition NVIDIA Jetson devices into a headless state. By analyzing current system state via memory audit data, it identifies and disables non-essential daemons and the graphical desktop environment. The process emphasizes safety through dry-run defaults, explicit user approval, and documented reversal commands, ensuring that critical services like camera pipelines and power management remain intact.
What it does
- Generates a memory reclamation plan based on live system audit data.
- Switches the systemd default target from graphical to multi-user.
- Disables non-essential background services like Bluetooth, printing, and crash reporting.
- Provides a dry-run mechanism to preview changes before application.
- Includes built-in reversal commands for every applied change.
- Calculates estimated memory savings based on the specific device configuration.
When to use it
- When preparing a Jetson device for deployment as an edge inference appliance.
- When you need to maximize available system memory by removing GUI overhead.
- After running a memory audit that confirms the device is running unnecessary display managers.
- When you have confirmed the user does not require local display output or a desktop environment.
Advantages
- High-yield memory reclamation with minimal risk.
- Fully reversible changes ensure system state can be restored.
- Uses live device data for accurate, context-aware savings estimates.
- Prevents accidental disabling of critical system services like nvargus-daemon.
- Safe-by-default execution model requires explicit user confirmation for mutations.
Usage examples
- “How much memory can I save by putting my Jetson in headless mode?”
- The agent runs the planning script against your current audit data and reports the estimated total savings in MB, along with a list of recommended services to disable.
- “Apply headless mode to my Jetson device.”
- The agent performs a dry run of the headless configuration, displays the proposed changes for your approval, and then executes the changes if authorized.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/nvidia/jetson-headless-mode/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip jetson-headless-mode.zip -d .agents/skills
Documentation by Jetson Team
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.
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
jetson-memory-auditshowsdefault_systemd_target=graphical.targetor showsgdm3/lightdm/sddmactive on a system the user describes as headless.
When NOT to use
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
jetson-memory-auditfor a read-only view and suggest non-GUI memory options instead.You do not have current audit data. Run
jetson-memory-auditfirst, 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.
Prerequisites
Start from a current
jetson-memory-auditJSON snapshot.Confirm the user does not need the local desktop, display output, kiosk UI, or X/Wayland session.
Mutating changes require
sudoand explicit user approval; dry-run first unless approval was already given in the same prompt.Run on the Jetson host or in a host-visible sandbox with access to systemd state.
Available Scripts
| 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.
Instructions
Run
scripts/plan.shto readaudit.json(fromjetson-memory-audit) and emit a plan with onlysafety: safeknobs (target switch, display managers, audio, print, modem, etc.).Show the plan to the user and confirm.
Run
scripts/apply.sh --plan plan.jsonfor a dry run. Re-run with--applyto execute. Add--drop-cachesto flush the page cache afterward, or--rebootto take effect immediately.Re-run
jetson-memory-audit/scripts/audit.shto verify the actual delta.
Expected workflow
Use the scripts for estimates and application so recommendations are based on the current device state rather than the static upper-bound table alone.
For "what would headless save", "estimate", "plan", or production planning prompts, run
scripts/plan.sh --audit <audit.json>and reportestimated_total_savings_mb, the toprecommendations[*].knob, and whether any display manager orgraphical.targetis active. Do not runapply.sh.For prompts where the user explicitly says to apply headless mode now, run
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--applyand mention the reversible command(s).If direct execution fails in an agent runtime, invoke scripts with
bash {baseDir}/scripts/<script-name> .... Do not try tochmodinstalled skill files.
Plan / apply contract
plan.shemits the same JSON shape asjetson-inference-mem-tune/scripts/recommend.py: an array ofrecommendationswith{layer, knob, estimated_savings_mb, safety, command, reversible_command, rationale}.apply.shfilters entries tosafety == "safe"with a non-emptycommand, 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.Default mode is dry-run.
--applyis required to mutate the system.
Knobs covered
| 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 |
Do NOT disable these services
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.
Safety
Does not edit
/boot/extlinux/extlinux.conf, the device tree, or boot-time memory reservations.Does not disable services it does not have an explicit entry for (no blanket "disable everything not whitelisted").
Every applied change has a documented
reversible_command. Re-running the plan with the reverts is sufficient to restore.Dry-run by default.
--applyis the only way to mutate.Report only device facts and savings figures that came from live detection or audit output.
Cross-platform behavior
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.
Files
- ATTRIBUTION.mdAdded by AutoGineer923 B
- BENCHMARK.md3.2 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md7.5 KiB
- evals/evals.json6.4 KiB
- scripts/apply.shScript5.7 KiB
- scripts/plan.shScript5.1 KiB
- skill-card.md3.6 KiB
- skill.oms.sig4.9 KiB
skill.oms.sig
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiamV0c29uLWhlYWRsZXNzLW1vZGUiLAogICAgICAiZGlnZXN0IjogewogICAgICAgICJzaGEyNTYiOiAiYmZjZDYzNzQxZjkxMWM2M2JiZjM1NjFlOGIwZmJlN2E1YWYxNDNmYjc0YjZmNGM4MWUyNWZjZTY3N2I2MTM5YyIKICAgICAgfQogICAgfQogIF0sCiAgInByZWRpY2F0ZVR5cGUiOiAiaHR0cHM6Ly9tb2RlbF9zaWduaW5nL3NpZ25hdHVyZS92MS4wIiwKICAicHJlZGljYXRlIjogewogICAgInNlcmlhbGl6YXRpb24iOiB7CiAgICAgICJpZ25vcmVfcGF0aHMiOiBbCiAgICAgICAgIi5naXRodWIiLAogICAgICAgICIuZ2l0YXR0cmlidXRlcyIsCiAgICAgICAgIi5naXQiLAogICAgICAgICIuZ2l0aWdub3JlIgogICAgICBdLAogICAgICAiaGFzaF90eXBlIjogInNoYTI1NiIsCiAgICAgICJtZXRob2QiOiAiZmlsZXMiLAogICAgICAiYWxsb3dfc3ltbGlua3MiOiBmYWxzZQogICAgfSwKICAgICJyZXNvdXJjZXMiOiBbCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI3N2M1YWE3OGRjYWEzNmVkODAwOTk3M2Q2ODk2OWNlMzUzMDNmZTQ5MzQwZTNiYjg5NDllNjBmZTVlMTI5ZjBlIiwKICAgICAgICAibmFtZSI6ICJCRU5DSE1BUksubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI5MWYyZjE3ZmI5ZTU0YWFjZWI2ZTFlODc2MjkyZThmNzE4MjQ4MzcxNWExMjBmZjhmNjg5OTJjOTZiMjgxY2I4IiwKICAgICAgICAibmFtZSI6ICJTS0lMTC5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjc5OGE0YjVmZTFhZjdlYmJiYTk5OGQzZTUwNTExNWM0ZWZmNDNhZjFjOGQ3OTUzNmQyZDVjZGNkZjkyZTJkYmIiLAogICAgICAgICJuYW1lIjogImV2YWxzL2V2YWxzLmpzb24iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICJiOWVjMzc2MzY0OTk3ZmEyYjVhZDdhNzZmNTQwMDg3YjFjY2M5MDI2MmE0MjIwZmJmMDZjMDU2MTFlNDg5MzQ3IiwKICAgICAgICAibmFtZSI6ICJzY3JpcHRzL2FwcGx5LnNoIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiMzdmYzJiOTFjYTc5NmYzNDBiOWU1MDgxNTMyZjRiMGZjZjJiYTVjMmZmNjhlOGFkN2I4MWY5ODMzOTNiN2UyZSIsCiAgICAgICAgIm5hbWUiOiAic2NyaXB0cy9wbGFuLnNoIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiZDU1OTgwMzU3YjdhYWFkMDdkMGI2ZWNjODliNmNiNzFkY2JjYmY5MDFkNjUyYWE1NDRlY2FkNDRhNGU5YWNmMiIsCiAgICAgICAgIm5hbWUiOiAic2tpbGwtY2FyZC5tZCIKICAgICAgfQogICAgXQogIH0KfQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGYCMQD4dQEZAfmtjxkb4NQ3Gsh/Ic1VCa9Ox75rQr/Dsfq8rrNUIUs0yL9du+rdhjmwB8ACMQCmiRvtg/TQcNTac0fNSK19HMu1DfP7Me/sbkt5B04p428uGVuLhAz9DS2/BIc/JME=","keyid":""}]}}Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Jetson Team
- Publisher
- NVIDIA (Official)
- Distributed by
- NVIDIA
- Source
- NVIDIA/skills · skills/jetson-headless-mode · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Jetson Team or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download jetson-headless-mode.zip