Skip to content
NAILS on GitHub
These docs describe NAILS 0.3, published so far as the release candidate v0.3.0-rc.3. They do not apply to v0.2.0, the latest stable release. Download and verify NAILS 0.3

Requirements

NAILS needs an x86-64 machine running NixOS, Debian 13, or Ubuntu 24.04 or 26.04, with systemd 254 or newer. The decoy must use full-disk encryption, keep no durable record of the session and have its root on a block device. The hidden volume must be storage of its own, which you unlock and mount yourself. NAILS runs as root, through sudo from a local account.

nails check runs every pre-flight check, changes nothing and prints what activation would do. Run it before your first session. Under each failing check it prints a hint that names the fix.

RequirementNotes
A supported hostNixOS, Debian 13, or Ubuntu 24.04 or 26.04, with systemd 254 or newer. A later Debian or Ubuntu release runs with a warning that NAILS has not been tested on it. Derivatives of Debian or Ubuntu are accepted provisionally. Other hosts are refused. See Supported platforms.
An encrypted decoyFull-disk encryption whose credentials open the decoy and nothing else. The threat model assumes it. NAILS does not provide it.
An amnesic decoyA volatile journal, no rsyslog, syslog-ng or auditd and no disk swap. Activation refuses a decoy that keeps records otherwise. An override covers the journal, syslog and audit refusals, never the swap check. See Prepare the decoy.
A decoy root on a block deviceext4, xfs, btrfs, including a subvolume, or f2fs. The way back mounts the decoy root again by its device.
A hidden volume of its ownA whole device, a partition or an encrypted volume that the decoy does not use, which you unlock and mount yourself. It must be writable and managed by the kernel, such as dm-crypt or a loop device, with ext4, xfs, btrfs or f2fs inside. See Hidden volume.
Root accessactivate, deactivate, emergency, recover and the rehearse steps that write refuse to run without sudo. Run the other commands with sudo too, so they can read and write root-owned files. The configuration init writes is readable by root only.
A local accountThe account you run sudo from must be in /etc/passwd. The static binary does not use NSS, so LDAP or SSSD accounts cannot be resolved.
An x86-64 machineReleases are built and tested for x86-64 only. 64-bit ARM is on the roadmap.

Prepare the hidden volume where nothing reaches the decoy’s disk. An external drive set up on another computer is the recommended way. A live system started from a USB stick, which writes nothing to the internal disk, is the other. Never create the volume on the decoy. NAILS refuses a hidden volume on the decoy’s own storage, except an encrypted container file, which only warns. It cannot see what creating a volume there left behind. To install NAILS the first time from a live system, see First install from Tails.

NAILS detects the host from /etc/os-release and the running init system, and names it in the platform row of nails check. That row warns on a release NAILS has not been tested on. It fails on a host that activation refuses, with the same reason.

PlatformSupport and notes
NixOSFull. A hidden NixOS configuration, a flake or configuration.nix, is built and entered in the same step. It must run on the decoy’s kernel. A pinned nixpkgs without the two soft-reboot units needs a small module, which nails check prints.
Debian 13 (trixie)Root overlay. The same whole-root session. The hidden configuration is whatever the upper’s /etc holds. Requires the merged /usr layout.
Ubuntu 24.04 and 26.04Root overlay. As Debian. On 26.04, chrony and CUPS fail in the hidden session, and the decoy shows chrony as failed until a full reboot. Reboot fully after a session. See Prepare the decoy.
Other releases after Debian 13 or Ubuntu 24.04Untested. Accepted on the same terms, with a warning in init, check and activate that NAILS has not been tested on the release, such as Ubuntu 25.04 or 26.10.
Debian-family derivativesProvisional. Accepted on the same terms when ID_LIKE names debian or ubuntu and systemd is new enough. The base release is not checked.
Debian 12, Ubuntu 22.04Refused. systemd is too old for a soft-reboot (252 and 249).
Fedora, Arch, other distributionsRefused. No validated backend yet. Fedora and Arch backends are planned on the roadmap.
ostree and image-based hostsRefused. NAILS cannot overlay an immutable system.
Hosts without systemd, such as OpenRC or runitRefused. The session is entered and left with a systemd soft-reboot.

Automated tests run the session in NixOS, Debian 13 and Ubuntu 24.04 virtual machines.

The pre-flight checks also refuse:

  • a hidden volume that is not storage of its own, which the attach gate refuses before anything is written or probed: a folder, a btrfs subvolume or bind mount of a filesystem the decoy uses, a volume stacked on the decoy’s storage or swap, an unencrypted image file on a decoy filesystem, an overlay, FUSE, network or ZFS filesystem, or a root with a second filesystem mounted over it
  • a line in the decoy’s /etc/crypttab or /etc/fstab that opens or mounts the hidden volume or a device it is stored on
  • a hidden volume whose filesystem cannot host an overlay upper layer, such as FAT, exFAT and NTFS
  • a decoy root on tmpfs, ZFS or an overlay, which rules out an impermanent root
  • active disk swap, while RAM-backed zram is allowed
  • a persistent journal or an active syslog or audit daemon, unless you accept that risk with --accept-persistent-decoy
  • running inside a container or in another mount namespace than PID 1’s
  • on NixOS, a .nix file in /etc/nixos that names the hidden volume or NAILS, and a build of the decoy’s own /etc/nixos flake, as What /etc/nixos must not name explains

--no-preflight does not skip these refusals:

  • the attach gate
  • the crypttab and fstab check, which no flag overrides
  • the refusal to build the decoy’s own flake

--allow-decoy-storage turns the refusal of the decoy’s own storage into a warning. Use it only for storage you know the decoy does not use, such as a disk its fstab lists but never mounts. It never covers a folder, a covered root or storage that cannot be judged. An encrypted container file on a decoy filesystem is not refused, but it warns: the filesystem’s journal and copy-on-write snapshots can keep old copies of the parts of the container that changed.

For a stronger posture, keep /var and /home on storage that is wiped at boot. Only the decoy root itself has to stay on a disk.