kunchenguid/headless
Agent skill that sets up a headless Mac, Linux or Windows machine over SSH, step by step, without ever seeing the admin password.
About kunchenguid/headless
kunchenguid/headless is an open-source project on GitHub, mainly written in Shell. Agent skill that sets up a headless Mac, Linux or Windows machine over SSH, step by step, without ever seeing the admin password. It currently holds 179 stars and 12 forks with 20 open issues, and was last pushed on 2026-11-08 (repository created 2026-11-07).
Project Overview
AI Homed tracks it on the Today's Trending board, currently at rank #81 with 0 new stars today.
GitHub Repository Details
README
/headless
What if a new machine set itself up while you watched?
A Mac mini in a closet, a Linux box under the desk, a Windows PC nobody sits at. Making one run unattended means a dozen settings at the console - never sleep, sign in by itself after a restart, SSH keys only - and then, usually, handing your agent the admin password so it can do the rest.
headless is an Agent Skill that takes a machine from "an admin account with a password and remote login on" to a configured headless machine over SSH, one step at a time: it never sleeps, signs itself in after a restart, takes SSH keys only, and optionally joins Tailscale. The admin password stays in your secret store; the agent only ever names the entry.
- The password never reaches the agent - it stays in Automic Vault,
- Mac, Linux and Windows - Apple silicon Macs with
- Every step reruns safely - each step says what it does, runs, and shows
- Proven end to end - each platform's whole journey runs on a
Quick Start
# install (global recommended)
$ npx skills add kunchenguid/headless -g
in your agent
/headless set up my Mac mini at 192.168.1.20 as a headless machine
What it needs
- Your computer: macOS or Linux with bash, ssh and tar (and Nix, only to
- The machine: an Apple silicon Mac on a current macOS, an x86_64 or
- A secret store for that password. Tailscale is optional.
How It Works
For a Mac the skill walks you through seven steps:
admin account + password + Remote Login on
│
▼
┌────────────────────┐
│ admin access │ you, once, at the Mac
└─────────┬──────────┘
▼
┌────────────────────┐
│ save the password │ you, once, in your secret store
└─────────┬──────────┘
▼
┌────────────────────┐
│ config folder │ on your computer, from this repository's default config
└─────────┬──────────┘
▼
┌────────────────────┐
│ first SSH sign-in │ host key pinned · your key added
└─────────┬──────────┘
▼
┌────────────────────┐
│ admin session │ Determinate Nix · FileVault off · automatic sign-in
└─────────┬──────────┘
▼
┌────────────────────┐
│ apply │ the config · Tailscale if you want it
└─────────┬──────────┘
▼
┌────────────────────┐
│ verify + restart │ every setting read back · the Mac comes back
└─────────┬──────────┘
▼
headless Mac
A Linux machine takes the same path, without the admin session: after the first sign-in, a machine on NixOS is applied as it is; on another distribution you choose between installing NixOS (the whole disk is erased) and keeping it with the script.
A Windows PC starts with a few lines you paste in an administrator PowerShell to turn OpenSSH Server on (and, on a home or office network Windows calls Public, to mark it Private so SSH gets through the firewall). After the first sign-in, applying the config sets key-only SSH, automatic sign-in (the password kept as an LSA secret), the extras and Tailscale.
Usage
| Invoke | Example |
| ------ | ------- |
| Slash | /headless set up my Mac mini at 192.168.1.20 as a headless machine |
| Natural language | "update my headless Linux server and check it comes back after a restart" |
The agent should auto-invoke when asked to set up, configure, update or check a machine you reach only over SSH.
Package layout
skills/headless/
SKILL.md # the agent contract: the rules and every step
references/ # mac.md · linux.md · windows.md · secrets.md · tailscale.md
scripts/ # mac/ · linux/ · windows/: connect, apply, verify, restart, tailscale
assets/ # darwin/ · nixos/ · windows/: the default configs the skill copies
modules/
darwin/headless.nix # the nix-darwin module, darwinModules.headless
nixos/headless.nix # the NixOS module, nixosModules.headless
flake.nix # the modules, templates.darwin (default) and templates.nixos
tests/ # the secret helper's test and the Mac, Linux and Windows journeys CI runs
Ships as an npx skills package.
The repository is also a Nix flake, and the modules are the layers the skill applies. Use them from your own flake:
inputs.headless.url = "github:kunchenguid/headless";
in your darwinSystem modules:
headless.darwinModules.headless
{ headless = { user = "admin"; sshKeys = [ "ssh-ed25519 ..." ]; }; }
nixosModules.headless is used the same way in a nixosSystem. The options
are listed in skills/headless/references/mac.md and
skills/headless/references/linux.md.
nix flake init -t github:kunchenguid/headless#nixos (or #darwin) gives the
starting config the skill copies, the NixOS one with a disko disk layout for
new installs.
Development
# edit the skill
$EDITOR skills/headless/SKILL.md
smoke-test discovery locally
npx skills add ./ -l
install from this checkout
npx skills add ./ -g -y
checks
nix flake check # modules and default configs build (this system's)
tests/secret-run.test.sh # the password is piped, never printed
shellcheck -x tests/.sh skills/headless/scripts/.sh skills/headless/scripts//.sh skills/headless/scripts//remote/.sh
The mac workflow runs the whole journey on a GitHub-hosted Mac, over SSH
to itself. The linux workflow runs the distro-neutral script on a
GitHub-hosted Ubuntu runner over SSH to itself, and installs NixOS with
nixos-anywhere on an x86_64 Ubuntu virtual machine there, then applies,
restarts and verifies it. The windows workflow checks every PowerShell
file parses, then runs the Windows journey on a GitHub-hosted Windows Server
runner over SSH to itself, from Ubuntu under WSL. Each checks its log never
holds the password.
Pull requests to main are raised through
no-mistakes: the
PR must be raised via no-mistakes check stays red on a pull request opened
by hand until its branch is pushed through the gate (git push no-mistakes),
which writes a pipeline attestation into the pull request's description.