Open-source project
skiffos/SkiffOS avatar
skiffos/SkiffOS

SkiffOS: a Buildroot config system for portable Linux

Any Linux distribution, anywhere.

818 stars65 forksShellMIT

At a glance

What is it?
SkiffOS is a configuration package system for the Buildroot cross-compiler, where a minimal read-only host handles hardware support and the user environment runs in containers, so the same distribution image works across devices of one CPU architecture. It suits embedded and edge deployments where a board support package per device does not scale.
Who is it for?
Adopt SkiffOS if you are shipping a Linux image across several boards of the same CPU architecture, or you need a host system that boots reliably and can be updated over the air, and you are prepared to own the configuration packages yourself. Do not adopt it if you need a single vendor supported distribution with a support contract, or if your deployment has to span different CPU architectures, because the portability claim is limited to devices sharing an architecture.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Shell, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A config package system, not a distribution

SkiffOS is described as a config package system for the Buildroot OS cross-compiler, and its one line summary is that any Linux distribution can run anywhere.

The mechanism is a merge. Configuration packages are combined to produce the system, and the combination is chosen with an environment variable. The README gives three examples:

bash
SKIFF_CONFIG=intel/desktop,core/fedora
SKIFF_CONFIG=pi/4,core/debian
SKIFF_CONFIG=virt/qemu,custom/config

The first builds a Fedora desktop configuration for an amd64 PC, the second a Debian desktop on a Raspberry Pi 4, and the third a custom configuration inside a Qemu virtual machine. The naming convention is legible on its own: the first element selects the hardware and platform, the second selects the user environment, and the third shows that you can substitute your own package in the same slot.

That is the whole idea in one variable. The project does not distribute an operating system in the usual sense. It distributes a way to assemble one, and the pieces are configuration packages held in version control, with a project template offered for teams that want to keep their own customisations under version control.

The three stated properties explain who this is for. Running any distribution anywhere decouples hardware support from user distro environments. Reliability comes from a minimal read-only host system for unbreakable boot-ups and over-the-air updates. Reproducibility comes from offline builds, pinned package versions and source-controlled custom configs.

Why a minimal read-only host changes the failure modes

The reliability claim rests on a specific architecture, and it is worth being precise about it because it is the part that differs most from a conventional distribution.

Linux devices vary in their requirements for kernel, firmware and other hardware support packages. SkiffOS decouples that support from the containerised environments, and the README draws the contrast explicitly: the containers are portable across devices with the same CPU architecture, while ordinary OS images, in other words board support packages, are not.

So the model is a small, fixed host that owns the hardware, and containers on top of it that own the software. The host is minimal and read-only, which is what makes boot-ups hard to break, because there is nothing on it to be corrupted by a failed update or a misbehaving package. The update story rides on the same property, with over-the-air updates named explicitly.

The trade is that you are not getting a distribution with a support contract behind it. You are assembling a host plus containers, and the pieces you assemble come from the project's package set. That is the right model for an embedded or edge product where the image is built once and shipped to many identical or near identical devices, and the wrong model for a workstation where you want the vendor's package management and security updates.

The supported target list makes the intended scale obvious, running from Raspberry Pi and Odroid boards through NVIDIA Jetson, desktop PCs, laptops including an Apple MacBook, phones, cloud virtual machines, and even web browsers.

The supported systems table is the real specification

Before evaluating SkiffOS, the supported systems table is the document to read, because it lists the config package, the bootloader and the kernel version for each target.

The virtualisation targets come first. VirtualBox, Incus and Qemu use the virt/ config packages with kernel 7.2.11 and no bootloader, and Docker images and WSL on Windows also have entries. UTM on macOS is listed as the combination of apple/arm and virt/qemu, which is a good illustration of the merge model since a single config string pulls in two packages. V86 on WebAssembly has its own browser/v86 package, a V86 bootloader and kernel 7.0, and that is also the entry behind the browser demo linked from the README.

The board entries are where the differences show. The BananaPi family, from the M1 through the M3, uses U-Boot 2025.01 with kernel 7.2.11. The BeagleBoard and BeagleBone entries use U-Boot 2022.04 with the 5.10.168-ti kernel, and the BeagleBoard BeagleV is listed under starfive/visionfive with an older U-Boot and an sv-5.19-rc3 kernel. The C.H.I.P. boards use U-Boot 2024.04 with 6.19.8. Intel x86/64 uses intel/desktop with rEFInd as the bootloader. The Jetson entries carry NVIDIA kernel branches, nv-5.10.120 for the AGX and nv-4.9.337 for the Nano and TX2. Apple Silicon is listed with UTM as a virtual machine rather than as a native bootloader.

The practical reading is that each board brings its own kernel and bootloader, and those are the parts you will debug.

Builds run through one script behind the Makefile

The build system is deliberately thin, and knowing where the work happens saves time.

The Makefile at the repository root does almost nothing itself. It sets TERM with a default of xterm and exports it, defines a catch-all rule that passes any target to a script, and defines a help target that calls the same script:

bash
%:
	@./scripts/primary_env.sh $@

In other words, make is a thin front end and scripts/primary_env.sh is the real entry point, which means that reading that script is the first thing to do when you want to know what a given target does. The help target exists for exactly that.

The repository layout supports the same picture. There is a configs/ directory for the configuration packages and a configs-base/ directory for the shared base, an overrides/ directory for changes layered on top, a workspaces/ directory, a build/ directory for output, doc/ for documentation, resources/ for assets such as the paper linked from the README, scripts/ for the build tooling, and a buildroot entry that is a git submodule pointing at the upstream cross-compiler.

That submodule detail matters for the reproducibility claim. Buildroot is pulled in as a pinned dependency rather than vendored, and the packages that the configuration selects are pinned by version, which is what makes an offline build possible from a fixed set of sources.

Reproducibility as a design constraint

The third stated property is reproducibility, and the README describes it as offline builds, pinned package versions and source-controlled custom configs. Each of those three is a separate discipline.

Offline builds mean the build does not depend on fetching sources at build time, which matters for two reasons. A build server behind a restrictive network can still produce an image, and two builds from the same sources produce the same result rather than whatever the upstream mirror served that day.

Pinned package versions mean the configuration packages declare exactly which versions they use, so a package update is a deliberate commit rather than something that happens to you. Combined with the config packages living in version control, the whole assembly of the system is a code review artefact.

Source-controlled custom configs complete the picture, and the project template linked from the README exists for that purpose. A team that needs a device-specific adjustment writes a package in their own repository, references it in SKIFF_CONFIG, and gets a change that is reviewed and revertible like any other code.

The mechanism to point at is the CITATION.cff file at the repository root, along with the .gitmodules file for the Buildroot submodule and the .githooks/ directory, which together indicate a project that treats its own build as something to be pinned and recorded.

Where SkiffOS is the wrong tool

Three situations clearly point elsewhere.

The first is a deployment that has to span CPU architectures. The portability claim in the README is scoped to containers being portable across devices with the same CPU architecture, so an arm board and an amd64 server are different builds even though the distribution inside them is the same.

The second is a workstation or a general purpose server where you want a vendor's package management, security updates and support contract. SkiffOS deliberately removes the mutable parts of the host, which is exactly what makes it dependable for an appliance and exactly what a workstation administrator does not want.

The third is a device that is not in the supported table. Each entry in that table represents a kernel and a bootloader that someone has already worked through the failures on. A new board with an unusual SoC means that work is yours, and the config package system does not remove it.

There is also a simpler strategic caution. The project describes itself as a config package system for a cross-compiler rather than as a distribution, so it sits on top of Buildroot and inherits its choices and its release cadence. If your reason for choosing it is that the packages are pinned and reproducible, that is a property of the ecosystem you are standing on, not something SkiffOS adds.

Editorial conclusion

Adopt SkiffOS if you are shipping a Linux image across several boards of the same CPU architecture, or you need a host system that boots reliably and can be updated over the air, and you are prepared to own the configuration packages yourself. Do not adopt it if you need a single vendor supported distribution with a support contract, or if your deployment has to span different CPU architectures, because the portability claim is limited to devices sharing an architecture. Verify three things first: that the config package for your exact board and kernel is in the supported table, since the bootloader and kernel versions differ per device; that the build is reproducible in your environment, since the project claims offline builds with pinned package versions; and how the read-only host handles your updates, because the reliability story depends on it. The licence is MIT, the release naming is by year and month with 2026.08 dated 2026-08-03, and the last push was on 2026-10-19.

Frequently asked questions

What is SkiffOS and what does it do?

It is a config package system for the Buildroot OS cross-compiler. Configuration packages are merged to build a system, with the combination chosen through SKIFF_CONFIG, so that hardware support is decoupled from the user distribution environment.

How do I choose what to build?

You set SKIFF_CONFIG to a comma separated list of configuration packages, for example intel/desktop,core/fedora to run a Fedora desktop on an amd64 PC, pi/4,core/debian for a Debian desktop on a Raspberry Pi 4, or virt/qemu,custom/config for a custom configuration in a Qemu virtual machine.

What makes SkiffOS boots reliable?

The host system is minimal and read-only, which the README credits with unbreakable boot-ups and over-the-air updates. Hardware support packages stay outside the containerised environments, so containers can move between devices of the same CPU architecture while ordinary board support package images cannot.

How do you build a SkiffOS image?

Through the Makefile, which forwards every target to scripts/primary_env.sh, and a help target that calls the same script with the help argument. The build pulls in Buildroot as a git submodule and uses the packages in the configs/ directory.

Which devices does SkiffOS support?

The supported systems table lists config packages, bootloaders and kernel versions for virtualisation targets such as Qemu, Incus, VirtualBox, Docker, WSL and V86 on WebAssembly, and for boards including Raspberry Pi, Odroid, BananaPi, BeagleBoard and BeagleBone, C.H.I.P., NVIDIA Jetson, OrangePi, Allwinner and Intel x86/64 machines.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. skiffos/SkiffOS on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/skiffos-skiffos.svg)](https://hysenlabs.com/projects/skiffos-skiffos)

Was this useful?