distros/skills/bootc-config/SKILL.md
Bootc system configuration: tty1 autologin, graphical target, pipewire/wireplumber enablement, and the systemd-user supervisord autostart unit that brings up supervisord-managed desktop services on bootc. Canonical home for any bootc-side boot wiring. Use when working with bootc images, autologin, systemd graphical target, or the supervisord-under-systemd autostart pattern.
npx skillsauth add overthinkos/overthink-plugins bootc-configInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Property | Value |
|----------|-------|
| Install files | task:, layer.yml |
sway-systemd (RPM) -- Sway systemd integration/etc/systemd/system/[email protected]/autologin.conf so the user account logs in automatically on the first virtual console.systemctl set-default graphical.target so the OS boots into the desktop, not multi-user.pipewire.socket and wireplumber.service for every user session via systemctl --global enable./etc/systemd/user/supervisord.service + systemctl --global enable supervisord.service.user — writes the sentinel file /var/lib/systemd/linger/user so the user's systemd instance starts at boot even without an interactive login.Each systemctl cmd is suffixed || true because the directives succeed on live systems but may fail harmlessly during offline bootc assembly.
The selkies-desktop and openclaw metalayers compose supervisord service: fragments for every desktop program (labwc, chrome, swaync, waybar, selkies, traefik, …). On container images that's fine: ENTRYPOINT=supervisord starts the whole tree as PID 1. On bootc images, systemd is PID 1 and nothing wraps supervisord by default — the desktop would never come up.
This layer ships the missing wiring: a systemd user unit at /etc/systemd/user/supervisord.service that runs /usr/bin/supervisord -c /etc/supervisord.conf -n, guarded by ConditionFileIsExecutable=/usr/bin/supervisord + ConditionPathExists=/etc/supervisord.conf so it no-ops on bootc images that don't use supervisord. It's systemctl --global enabled so every user session started via tty1 autologin brings the desktop tier up.
StandardOutput=file:/tmp/supervisord-stdout.log is load-bearingThe unit declares:
StandardOutput=file:/tmp/supervisord-stdout.log
StandardError=file:/tmp/supervisord-stderr.log
These aren't for log collection — they're required for supervisord's per-program stdout_logfile=/dev/fd/1 entries to resolve. Under a systemd user service without this redirect, fd 1 points at the journal pipe; per-program dispatchers call open("/dev/fd/1") on that pipe and get ENXIO: No such device or address, causing every program to enter FATAL with the message unknown error making dispatchers for <name>: ENXIO. Redirecting stdout to a real file makes /dev/fd/1 openable. Also: the supervisord header template was separately changed from logfile=/dev/stdout to logfile=/tmp/supervisord.log for the same reason — see /ov-infrastructure:supervisord.
loginctl enable-linger user is the usual way to enable linger, but it requires a running logind — which the offline bootc builder doesn't have. The equivalent effect is writing an empty file at /var/lib/systemd/linger/user. Existence alone enables linger at boot. This layer uses a mkdir: + cmd: touch pair to plant the sentinel (empty content doesn't pass write: validation).
# image.yml — this layer is included transitively via bootc-base
my-bootc-image:
base: "quay.io/fedora/fedora-bootc:43"
bootc: true
distro: ["fedora:43", fedora] # external bases need this — see /ov-image:image
layers:
- bootc-base
- <other desktop layers>
Part of the /ov-distros:bootc-base composition layer. Used transitively in every bootc image:
/ov-distros:bazzite — canonical worked example (exercises every piece of the supervisord + tty1 autologin + graphical target flow end-to-end)/ov-distros:aurora/ov-distros:bootc-base -- composition that includes this layer + sshd + qemu-guest-agent/ov-coder:sshd -- SSH server (also in bootc-base; NOPASSWD-sudo test handles the dual USER=root/1000 context)/ov-distros:qemu-guest-agent -- QEMU agent (also in bootc-base)/ov-infrastructure:supervisord -- the init system that this layer wires into systemd on bootc/ov-selkies:selkies-desktop-layer -- the 19-sublayer desktop metalayer that this autostart brings up/ov-vm:vm -- VM lifecycle + the /dev:/dev mount requirement for bootc install to-disk/ov-image:image -- the external-base distro: requirement/ov-build:generate -- the empty-systemd-services-stage fix that makes bootc images with only packaged systemd units (unified service: entries using use_packaged:) build cleanly/ov-eval:eval -- dual-mode USER context authoring gotcha (test #11)/ov-image:layer -- layer authoring referenceUse when the user asks about:
StandardOutput=file: trick)/var/lib/systemd/linger/user sentinel-file patternunknown error making dispatchers for <name>: ENXIO in supervisord logsdevelopment
Claude Code multi-agent support in Overthink — sub-agents, dynamic workflows, and agent teams, and how each drives the existing `ov eval` disposable beds to test and verify. MUST be invoked before authoring or invoking an ov sub-agent / dynamic workflow / agent team, wiring agent-lifecycle hooks, or asking "which primitive should drive the R10 beds?".
tools
Mounts a virtiofs share tagged `workspace` at /workspace inside a VM guest via a systemd .mount unit. Use when a kind:vm entity shares a host directory into the guest and you need it auto-mounted (and re-mounted at every boot).
development
MUST be invoked before any work involving: the `kind: android` schema kind, a `target: android` deploy, the `apk:` layer package format (installing Android apps declaratively), AndroidDeployTarget, an in-pod emulator OR a remote/physical adb-endpoint device, or nested `pod → android` deployment. The first-class Android device + app surface that sits above `ov eval adb`/`appium`.
tools
Use when committing, branching, pushing, merging, tagging, creating PRs, or approving/merging PRs with gh — the feat/-branch, R10-gated, never-force-push landing workflow across the main repo + the plugins submodule + image/<distro> submodules. Covers sync-to-upstream, branch/worktree pruning, the fork+PR path for contributors without write access, and cross-repo @github landing order.