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.
What you need
Section titled “What you need”| Requirement | Notes |
|---|---|
| A supported host | NixOS, 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 decoy | Full-disk encryption whose credentials open the decoy and nothing else. The threat model assumes it. NAILS does not provide it. |
| An amnesic decoy | A 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 device | ext4, xfs, btrfs, including a subvolume, or f2fs. The way back mounts the decoy root again by its device. |
| A hidden volume of its own | A 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 access | activate, 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 account | The 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 machine | Releases 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.
Supported platforms
Section titled “Supported platforms”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.
| Platform | Support and notes |
|---|---|
| NixOS | Full. 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.04 | Root 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.04 | Untested. 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 derivatives | Provisional. 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.04 | Refused. systemd is too old for a soft-reboot (252 and 249). |
| Fedora, Arch, other distributions | Refused. No validated backend yet. Fedora and Arch backends are planned on the roadmap. |
| ostree and image-based hosts | Refused. NAILS cannot overlay an immutable system. |
| Hosts without systemd, such as OpenRC or runit | Refused. 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.
Setups that are refused
Section titled “Setups that are refused”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/crypttabor/etc/fstabthat 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
.nixfile in/etc/nixosthat names the hidden volume or NAILS, and a build of the decoy’s own/etc/nixosflake, 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.