Get it

packages.marlinos/ is the index. current is the FreeBSD release line; dev tracks development.

FreeBSD images

Memstick and ISO. Each directory includes CHECKSUM.SHA256.

amd64
current dev
aarch64
current dev

FreeBSD packages

Index: packages.marlinos/.

amd64
current dev
aarch64
current dev

A memstick install already has the repo and its signing key at /usr/share/keys/pkg/pkg.marlinos.io. Package names: rsyslog, wake, fleetd.

mkdir -p /usr/share/keys/pkg
fetch -o /usr/share/keys/pkg/pkg.marlinos.io \
    https://marlinos.io/keys/pkg.marlinos.io

# /usr/local/etc/pkg/repos/MarlinOS.conf
MarlinOS: {
    url:            "https://pkg.marlinos.io/${ABI}-current",
    signature_type: "pubkey",
    pubkey:         "/usr/share/keys/pkg/pkg.marlinos.io",
    enabled:        yes,
    priority:       90,
}

pkg update
pkg install rsyslog wake fleetd

Linux packages

Debian 13 and Ubuntu 26.04, amd64, dev channel. Names: rsyslog, wake, marlinos-fleetd.

Debian 13
amd64-dev
Ubuntu 26.04
amd64-dev
curl -fsSL https://pkg.marlinos.io/packages.marlinos/marlinos.gpg \
    | gpg --dearmor -o /usr/share/keyrings/marlinos.gpg

# fingerprint: D32A E5CF AB44 65C4 86F0 54A1 4FC3 26FF FEFD E96D
echo "deb [signed-by=/usr/share/keyrings/marlinos.gpg] https://pkg.marlinos.io/Ubuntu:26.04:amd64-dev/ ./" \
    > /etc/apt/sources.list.d/marlinos.list

apt-get update
apt-get install rsyslog wake marlinos-fleetd

For Debian 13, swap Ubuntu:26.04 for Debian:13.

Alpine packages

Alpine 3.24, amd64, dev channel. rsyslog + WAKE stack only — no fleetd/fleetserver on this target. Names: rsyslog, wake.

Alpine 3.24
x86_64-dev
curl -fsSL https://pkg.marlinos.io/packages.marlinos/marlinos.rsa.pub \
    -o /etc/apk/keys/marlinos.rsa.pub

echo "https://pkg.marlinos.io/packages.marlinos/Alpine:3.24:amd64-dev" \
    >> /etc/apk/repositories

apk update
apk add rsyslog wake

Flatcar Container Linux images

Preview. Flatcar's read-only /usr rules out apt/apk, so this ships as two OCI images instead of packages, and the CI job that builds them runs allow_failure: true until a live LTS 4081 load is verified (ADR-0118). Everything below works against the published tarball; treat it as best-effort until that note is gone.

Flatcar LTS 4081, amd64, dev channel. rsyslog + WAKE stack only, same reduced scope as Alpine: no fleetd, no fleet-pushed config. journald stays the host logger; rsyslog tails it via imjournal.

Flatcar LTS 4081
amd64-dev
# fetch + load the images
curl -fsSLO https://pkg.marlinos.io/packages.marlinos/Flatcar:LTS-4081:amd64-dev/marlinos-wake_<version>_amd64.tar.gz
docker load < marlinos-wake_<version>_amd64.tar.gz

# compose.yaml: network_mode host (imtcp/imudp/imbeats + mesh),
# waked shares rsyslog's pid namespace to SIGHUP it on config reload
docker compose up -d

waked.toml and any operator rulebases are bind-mounts, same as Alpine: no fleet-pushed CTI, GeoIP, or rsyslog.d here. See Linux support for the delivery-model rationale.

pkgbase

Base and the MARLINOS kernel as pkg sets. Used by convert.

amd64
FreeBSD:16:amd64/base_current
aarch64
FreeBSD:16:aarch64/base_current

Install (FreeBSD)

Flash the memstick, boot it. The installer walks ZFS layout, network, and root password. On first boot set the enrollment broker. fleetd then logs its node id, and fleetctl enroll list shows the pending request; any unambiguous prefix of that id works as an argument:

sudo dd if=marlinos-memstick.img of=/dev/da0 bs=1M status=progress conv=fsync
sudo sysrc fleetd_enable="YES"
sudo sysrc fleetd_server="fleet.example.org:8444"
sudo service fleetd restart

Enroll

# operator workstation
fleetctl namespace add home --api https://fleet.example.org:8888
fleetctl login admin --namespace home   # namespace add only creates it

fleetctl enroll list
fleetctl enroll approve a1b2c3 --name edge-01

fleetctl device platform a1b2c3 wake-edge
fleetctl overlay push a1b2c3 -f overlays/site.yaml
fleetctl apply a1b2c3

See Fleet for the rest of the operator commands.

First fleetserver

One node runs fleetserver. The nas and vpn-hub platforms include it. Bring that host up first, then enroll the rest.

# fleetserver host
sudo pkg install fleetserver fleet-cli
sudo service fleetserver enable
sudo service fleetserver start

fleetctl namespace add home --api https://fleet.example.org:8888
fleetctl login admin --namespace home

Convert an existing FreeBSD 16 host

Point pkg at the MarlinOS pkgbase repository and upgrade base and kernel. Same end state as the memstick. Fetch the pubkey first (path matches the overlay on the image).

mkdir -p /usr/share/keys/pkg
fetch -o /usr/share/keys/pkg/pkg.marlinos.io \
    https://marlinos.io/keys/pkg.marlinos.io

# /usr/local/etc/pkg/repos/MarlinOS-base.conf
MarlinOS-base: {
    url:            "https://pkg.marlinos.io/${ABI}/base_current",
    signature_type: "pubkey",
    pubkey:         "/usr/share/keys/pkg/pkg.marlinos.io",
    enabled:        yes,
    priority:       100,
}

# /usr/local/etc/pkg/repos/MarlinOS.conf
MarlinOS: {
    url:            "https://pkg.marlinos.io/${ABI}-current",
    signature_type: "pubkey",
    pubkey:         "/usr/share/keys/pkg/pkg.marlinos.io",
    enabled:        yes,
    priority:       90,
}

sudo pkg update
sudo pkg upgrade -r MarlinOS-base -f -g 'FreeBSD-*'
sudo shutdown -r now
This only does anything on a host whose base is already pkgbase managed. On a classic base install the FreeBSD-* glob matches nothing and the command silently no-ops; use the memstick instead.

After reboot, uname -v reports the MARLINOS kernel. Then:

sudo pkg install fleetd
sudo sysrc fleetd_server="fleet.example.org:8444"
sudo service fleetd enable
sudo service fleetd start

Enroll as in the previous section.