TOML configuration
The machine is described in plain TOML instead of a purpose-built language. Every key is validated, and every error names the file it came from.
Packages, services, users, dotfiles, firewall rules and the security policy are managed together by one system manager, from one declarative configuration.
The pieces that make a NexisOS install reproducible and recoverable.
The machine is described in plain TOML instead of a purpose-built language. Every key is validated, and every error names the file it came from.
A host file lists the features it wants. Features are small reusable files: networking, ssh-server, hardening, doas, timesync. A fleet is one git repository of hosts.
Each change produces a new sealed composefs generation. Activation is atomic, and every kept generation is in the boot menu for rollback.
The store is never the runtime filesystem. Applications see an ordinary /usr, so prebuilt binaries run without patching.
Users, groups and their config files are declared with the host and sealed into the same generation, so rolling back the system rolls back home layers too.
nexis gc keeps the generations you ask for and frees the rest in one pass. There is no optimise step and no second run per user.
Getting software onto the system should not mean learning a language first.
Ordered, pinned sources rather than one central repository: prebuilt binary repositories, your own mirrors, or definitions built from source.
Files are stored once under the hash of their contents. Identical files are shared across packages, generations and environments automatically.
Builds run in sandboxes with declared inputs. Build scripts are hashed input, so changing how a package is built changes what it is.
Two packages installing the same path fail the build, naming both packages and the path, instead of one silently winning.
Services are declared, never scripted, and confined by default.
Each service gets a private /tmp and /dev, no network, no new privileges and only the capabilities it declares. Absent settings mean strict, not open.
schedule = "daily" on a service replaces a separate timer. A machine that was off when a run was due catches up at boot.
State, runtime, cache and log directories are created for the service user, with environment variables and environment files.
The store carries no set-ID files. A program that needs privilege, such as doas, is declared and placed in /run/wrappers/bin at activation.
Every networked install gets these layers by default.
refpolicy targeted, enforcing, loaded by nexis-init before any service. Labels are sealed into each generation, with nexis selinux explain for readable denials.
nftables with default-deny inbound. Ports come from service declarations, so removing a service closes its port. Optional egress default deny.
Signed repository databases with replay protection, package signatures, size and SHA-256 checks. A tampered download is refused and its server reported.
Built-in checks in Nim: file structure, ELF hardening, and what a new version can do that the old one could not. Atomdrift, Trivy and ClamAV are optional plugins.
[security] sets the level, the minimum trust and what blocks an install. Held packages go to quarantine, with Ghidra analysis on request.
Intrusion prevention reading the firewallβs own log: bans port scanners and brute-force sources, reports /etc drift and unexpected set-ID files.
KSPP kernel options, plus hardening and hardening-strict features for sysctls, lockdown and signed modules only.
/usr is verified by fs-verity. With the antivirus feature, a daily store scan re-hashes every object and rescans it with current signatures.
Early development. These are the design and what is being built. See the roadmap for what is still open.