Summary
nixvps collects NixOS guest policy for tiny cloud VMs, down to a 256MB floor: conservative runtime profiles, provider-facing guest requirements, and lifelines for machines with very little RAM. It is the receiver side only; the producer side such as caches, signing, and publishing is intentionally left to the adopter.
The repository is explicit about scope: boot policy belongs to the boot project
and every delivery path belongs to the deploy project. Its older pull-update,
deploy-target, and image-bake implementations remain present but are marked
as deprecated ownership overlaps to remove as consumers move, rather than
described as already migrated.
What it is
tiny-vm.nix: baseline profile for the roughly 1 vCPU and 1 GB RAM class (bounded journald, clamped daemon parallelism, automatic GC, capped boot generations).nano.nix: tighter profile for the 256MB to 512MB floor (serial builds, aggressive limits, minimal units, constant-memory monitoring).lifeline.nix: four independently toggleable headless-survival mechanisms (connectivity watchdog, SSH lifeline, serial console flight recorder, external heartbeat).pull-update.nix,deploy-target.nix,image-bake.nix: earlier autonomous update, deploy-target, and cloud-image implementations, retained as deprecated overlaps.- Declared checks (
checks/image-bake-module-eval.nix,checks/pull-update-module-eval.nix,checks/pull-update-generation-guard.nix,checks/lifeline-host-health*.nix),examples/,studies/, andBUILD-CONTRACT.md.
It is not a boot loader, image publisher, or deployment orchestrator.
How it works
Every profile setting uses lib.mkDefault, so adoption is an overlay of
conservative defaults the operator can narrow. The tiny-VM profile tunes mounts,
journals, daemon concurrency, and generation counts for the 1GB class; the nano
profile tightens further for the absolute floor.
Lifelines compose independently under nixvps.lifeline.*: the watchdog guards
connectivity on an interface, the SSH lifeline preserves admin access, the
console leg records flight data over serial, and the heartbeat reports outward.
The pull-update timer path fetches a signed closure pointer for unreachable
nodes behind NAT, while image-bake parameterizes a systemd-repart cloud image
with systemd-boot and a btrfs root as a starting point rather than a turnkey
per-provider image.
How to configure it
Compose the wanted NixOS modules, then enable profiles and lifelines under the
observed nixvps.* surface:
nixvps.tinyVm.enableornixvps.nano.enable— the RAM-class baseline, never both as primary. At the pinned revision neither profile evaluates cleanly (tiny-vm.nixsets retiredservices.journald.extraConfig); see Evidence and limits before enabling either.nixvps.lifeline.watchdog.enablewithiface— connectivity guard.nixvps.lifeline.sshLifeline,console,heartbeat— remaining survival legs.nixvps.pullUpdate,nixvps.deployTarget,nixvps.imageBake— deprecated overlaps; prefer their owning projects for new use.
Review BUILD-CONTRACT.md, examples/configuration.nix, and
studies/lifeline-escalation-ladder.md before enabling lifelines on a host
without console access.
Tutorial
This example uses invented values against the real option interface from the
referenced revision. The interface shape below was evaluated with the actual
nixosModules.lifeline module at the pinned revision using synthetic values
only; nothing was deployed.
# Synthetic example: invented host and interface choices.
{
imports = [ inputs.nixvps.nixosModules.lifeline ];
nixvps.lifeline.watchdog = {
enable = true;
iface = "demo0";
probeTargets = [ "192.0.2.1" ];
};
}This example deliberately enables only the lifeline survival leg and leaves the
tiny-vm and nano profiles disabled: at the pinned revision tiny-vm.nix
still sets the retired services.journald.extraConfig option, which the pinned
nixpkgs rejects at evaluation, so no executable example can honestly enable
tiny-VM policy until the upstream source is fixed (see Evidence and limits). The
watchdog requires at least one probe target, asserted at evaluation time, and
documentation addresses stand in for real ones.
Building the parameterized image target uses the host configuration:
# Synthetic example: public placeholder only.
nix build .#nixosConfigurations.demo-host.config.system.build.imageTreat every setting as an overridable default to review against the provider’s actual RAM class and console availability.
Evidence and limits
This page is bound to public revision
fa60fe2106e3fae85cb4aa19b23857faee86d2ba. That tree contains the flake
outputs, modules/ implementations, checks/ evaluations, examples/,
studies/, lib/pull-update-generation-guard.sh, and BUILD-CONTRACT.md
discussed above.
CNIX has not independently established a successful evaluation, build, boot,
deployment, or workload result for that revision. The tutorial interface above
was evaluated against the real lifeline module at that revision with synthetic
values and no residual assertions. The tiny-vm and nano profiles are not
demonstrated anywhere on this page: enabling them fails evaluation at the pinned
revision because tiny-vm.nix sets the retired services.journald.extraConfig
option, and disabled profiles are not validated tiny-VM policy. Memory-floor
claims, lifeline behavior, and delivery-module deprecation state are described
from source structure, not from reproduced runs.
Related
nixvps owns tiny-VM guest policy and headless survival only. Host-memory tuning, boot policy, delivery orchestration, share mounting, and notification dispatch are sibling concerns with their own revision-addressed concepts. Its relationship to other Corbet Nix projects is currently a shared design direction, not evidence of runtime integration.