Natural Language NixOS Config Skill
Users describe what they want in plain English. You write the NixOS config.
Workflow
Understand the request "Set up PostgreSQL with nightly backups" "Install and configure Caddy as a reverse proxy for port 3000" "Enable fail2ban to block brute force SSH"
Read current config
file_read({ path: "/etc/nixos/configuration.nix" })Generate the NixOS module Write idiomatic NixOS configuration. Use
services.*,networking.*,security.*etc. Prefer declarative NixOS options over imperative scripts.Show the diff to the user Present EXACTLY what will change. Use a code block with +/- diff markers. Explain each change in plain English.
Wait for approval NEVER apply changes without user confirmation. "Here's what I'll add to your NixOS config. Apply it? [Y/n]"
Apply atomically
shell_exec({ command: "nixos-rebuild switch" })Verify Check the service started correctly.
service_status({ service: "postgresql" })Log everything
memory_store({ summary: "Installed PostgreSQL with nightly pg_dump backups", detail: "Added services.postgresql, services.postgresqlBackup to configuration.nix. Generation 49.", category: "system.config", tags: "nixos,postgresql,config-change" })
NixOS Config Conventions
- Configuration goes in
/etc/nixos/configuration.nixor imported modules - Use
mkIf,mkOption,mkDefaultwhen extending existing config - Prefer
services.X.enable = true;patterns - For packages: add to
environment.systemPackages - For firewall:
networking.firewall.allowedTCPPorts - For users:
users.users.X
Example Interaction
User: "Set up nginx to serve a static site from /var/www"
Response:
I'll add nginx to your NixOS config. Here's the change:
services.nginx = {
enable = true;
virtualHosts."default" = {
root = "/var/www";
locations."/" = {
index = "index.html";
};
};
};
networking.firewall.allowedTCPPorts = [ 80 443 ];
This will:
- Install and start nginx
- Serve /var/www on port 80
- Open ports 80 and 443 in the firewall
Apply this? The change is atomic and rollbackable.
Rollback
If a rebuild breaks something:
shell_exec({ command: "nixos-rebuild switch --rollback" })
Then investigate what went wrong.
Critical rules
- ALWAYS show the diff before applying
- ALWAYS wait for user approval
- ALWAYS verify after rebuild
- NEVER edit /etc/nixos files without reading them first
- Store every config change in memory for time-travel debugging