The OS

MarlinOS is FreeBSD with a kernel config, a CAN networking stack, the fleet agent, the WAKE detection daemons, and a set of platform YAML files. The host stays small; package mass lives in the jails, picked per workload.

Base system

We track FreeBSD-CURRENT and ship a custom kernel config plus a short list of additions. No fork: MarlinOS installs on top of the FreeBSD pkgbase stream.

Hardened base
GENERIC minus debug, ZFS-only root with boot-environment rollback, PF composed from platform + overlay, fleetd as unprivileged _fleetd with path-scoped sudoers. No extra userland attack surface on the host beyond what the platform YAML declares.
MARLINOS kernel config
Derived from GENERIC with debug options removed (include "std.nodebug"), plus the NetCAN device modules built in. Built for both architectures.
pkgbase delivery
Base system and kernel ship as pkg-installable sets from pkg.marlinos.io. Upgrades are pkg upgrade; rollback is a ZFS boot environment.
Dual architecture, native builds
Both FreeBSD:16:amd64 and FreeBSD:16:aarch64 are built on native Poudriere runners.
ZFS root, boot environments
ZFS is the only supported root filesystem. Each base upgrade produces a new boot environment; a failed upgrade rolls back from the loader.

What MarlinOS adds

Two delivery channels: pkgbase for the kernel and base system (MARLINOS kernel config + NetCAN userland), ports for everything else. Linux gets the ports layer only, with naming and coverage in Linux support below.

ComponentWhereWhat it does
MARLINOS kernel + NetCANpkgbaseGENERIC minus debug, plus NetCAN (can, can_raw, can_nmea2000, vcan, ahc0512). See NetCAN.
CAN userlandpkgbasecanconfig, candump, cansend, slcand, n2kdump. Ship with the base system.
fleetdfleetdDevice agent. Talks to fleetserver, applies platform YAML, reports drift.
fleetserverfleetserverHeadless REST API + enrollment broker. Required on one node.
fleet-clifleet-clifleetctl for operators. Multi-namespace, fan-out for list verbs.
fleet-platformsfleet-platformsEight YAML platforms (hosting, nas, identity, wake-edge, soc-console, vpn-hub, build-worker, racing-boat) plus their default app_configs/. See Platforms.
fleet-backupfleet-backupSanoid/syncoid wrapper with engine helpers (MariaDB, PostgreSQL).
rsyslogrsyslogFreeBSD’s rsyslog rebuilt with our SIMD TurboVM patches against liblognorm, plus the WAKE modules mmenrich / mmsigma / mmwake.
WAKEwakewaked + libwake + the WAKE rsyslog rulebases. See WAKE.
host-defaultshost-defaultsCanonical /usr/local/etc/* for common tools.
Racing daemonscompute-daemon, assistantFill the compute and vis jails on racing-boat.
The host is small; the jails are not. A hosting platform pulls in PHP 8.4, MariaDB clients, Redis, Nextcloud, WordPress, Dolibarr, certbot, and Stalwart, one jail at a time.

Linux support

No image, no MARLINOS kernel, no jails: on Linux the ports layer drops onto whatever base install is already there. amd64 only, on the dev channel, one package repo per distro on pkg.marlinos.io.

Debian 13 amd64 · dev rsyslog · wake · marlinos-fleetd
Ubuntu 26.04 amd64 · dev rsyslog · wake · marlinos-fleetd
Alpine 3.24 amd64 · dev rsyslog · wake
Flatcar LTS 4081 amd64 · dev · OCI marlinos-rsyslog · marlinos-waked Preview: CI build is allow_failure until a live LTS 4081 load is verified.

Package names differ only where they would collide with a distro package: Linux ships marlinos-fleetd, marlinos-fleetserver, and marlinos-fleet-cli. rsyslog, wake, and libwake keep those names everywhere. Alpine carries the rsyslog + WAKE stack only, no fleetd or fleetserver. See Get it for the repo setup on each distro.

Flatcar is a different shape: read-only /usr, no apt/apk, so the detection stack ships as two OCI images (marlinos-rsyslog, marlinos-waked) instead of packages. journald stays the host logger; rsyslog tails it. No fleetd here either, same operator-managed config model as Alpine. See Get it for the docker load + compose steps.

Primitives

Each platform picks the primitives it needs. None of these is universal.

Bastille jails
Used by multi-service platforms - hosting (5 jails), racing-boat (5 jails), and identity (its keycloak-db jail). Synthesized server-side from the platform YAML. thin / thick / linux / clone are supported; vnet is intentionally not. The others (nas, wake-edge, vpn-hub, soc-console, build-worker) run services directly on the host.
NATS message bus
Used by racing-boat only - the gateway/compute/persistence/vis jails communicate over it. No other shipped platform brings in NATS today.
ZFS datasets with sanoid policy
Every FreeBSD platform uses ZFS root. Datasets are declared in the platform YAML with their Sanoid retention inline; fleet-backup hands off to engine-specific helpers (MariaDB, PostgreSQL) for consistent snapshots; syncoid ships them elsewhere when needed.
PF + dual-stack IPv6
FreeBSD platforms compose PF rules from platform + overlay, with synthesized RDR anchors per jail. ULA IPv6 with NPTv6 across the fleet’s WireGuard fabric where used.
WireGuard transport
Fleet-managed mesh, opt-out per host. nas and hosting on a LAN typically set wireguard_enable: NO; vpn-hub is the hub. See Fleet.

Build channels

ChannelPath on pkg.marlinos.ioUse
currentFreeBSD:16:<arch>-currentRelease channel. Cut from master.
devFreeBSD:16:<arch>-devTracking channel. Cut from dev. Use for testing.
pkgbaseFreeBSD:16:<arch>/base_currentFreeBSD base + MARLINOS kernel as pkg sets.