← ~/blog

Introducing Daedalus - A Visual Builder for Bootable Linux Images

The problem

I work on CoreOS - an immutable, container-native Linux distribution. The way you build a custom CoreOS image is by writing a Containerfile that layers your packages, users, services, and configuration on top of a base image. Then you run podman build, then bootc install to-disk to produce a disk image, then figure out the right flags for your output format. Then you debug the YAML indentation error on line 47.

It's not that any of this is hard. The concepts are straightforward: pick a base image, install packages, create users, enable services, build. But the syntax gets in the way. A misplaced space in YAML breaks the entire config. A wrong RUN layer order in a Dockerfile means your build cache is useless. A missing && in a shell command silently swallows an error.

For people who already know Containerfiles and systemd, this is fine. For everyone else - homelabbers trying CoreOS for the first time, sysadmins evaluating bootc, students learning Linux - it's a wall. They're not stuck on the ideas. They're stuck on the formatting.

What Daedalus does

Daedalus is a web wizard that generates everything you need to build a custom bootable Linux image. No Containerfile knowledge required. No YAML. No memorising dnf flags or systemctl syntax.

The wizard walks you through 10 steps:

  1. Base Image - pick from Fedora 44, Rawhide, or CentOS Stream
  2. Identity - name your OS, set a hostname, write a description
  3. Users - create accounts with SSH keys (generated in-browser), passwords, groups, and shell preferences
  4. Packages - choose from presets (Web Server, Development, Monitoring...) or add individual packages
  5. Configuration - timezone, locale, firewall rules, custom repos
  6. Branding - MOTD banner, ASCII login art, system logo
  7. Systemd - enable/disable services, add custom units
  8. Updates - configure bootc auto-update intervals
  9. Extensions - browse a catalog of 45 system extensions (more on this below)
  10. Review - see everything at a glance before downloading

A live preview panel on the right shows the generated Containerfile updating in real time as you make choices. When you're done, hit "Download All" - you get a zip with your Containerfile, build script, and optional Butane config. Run build.sh, pick your output format (qcow2, ISO, AMI, VMDK), and you've got a bootable disk image.

Why a wizard, not more docs

Documentation tells you what's possible. A wizard shows you what's relevant.

When I was learning Containerfiles, the reference docs listed every instruction - FROM, RUN, COPY, ARG, LABEL, ENTRYPOINT, CMD, HEALTHCHECK... Most of them irrelevant to building an OS image. I didn't need ENTRYPOINT. I didn't need HEALTHCHECK. I needed to know how to install packages without leaving cache behind and how to create a user with an SSH key. But I had to read through everything to figure out which parts mattered.

Daedalus scopes each step. You can't misconfigure a firewall rule you never touched. You can't accidentally create a user without a login method (the wizard warns you). And the generated Containerfile is readable - if you want to learn what's happening under the hood, just read the output. It's not minified or abstracted. It's the same Containerfile you'd write by hand, minus the typos.

System extensions

The part I'm most excited about is the extensions catalog. System extensions (sysexts) are a way to add software to an immutable OS without modifying the base image. They're EROFS disk images that overlay onto /usr at runtime - so you get neovim or docker-ce or kubectl without baking them into your image.

Daedalus ships a catalog of 45 extensions across 8 categories: editors, shells, containers, development tools, system utilities, networking, cloud agents, and virtualisation. Select the ones you want, and the generated Containerfile bakes in the download configs. On first boot, the system fetches the extensions automatically. They auto-update independently from the base OS.

This is particularly useful for tools you want available but don't want in your base image - debug utilities, monitoring agents, VPN clients. The image stays lean, and extensions can be added or removed without rebuilding.

The name

Daedalus was the master craftsman of Greek mythology - the architect of the Labyrinth and the inventor of wings. The name felt right for a tool that helps you build something complex through a guided path. The favicon is a labyrinth motif. The UI uses a bronze workshop palette, because of course it does.

Try it

Daedalus is live at adamcoding.com/daedalus. The source is on GitHub. It's a React + Vite app - no backend, no accounts, everything runs in your browser.

If you've been meaning to try CoreOS or bootc but got stuck on the config files, give it a shot. And if you're already comfortable writing Containerfiles by hand, try it anyway - it's faster than copy-pasting from your last build.