Custom Home Theather PC operating system with Plasma Bigscreen and pre-installed apps, based on bootc/universal blue(the project is NOT affiliated with universal blue, it's just based on their OS)
- Kinoite base - Fedora Kinoite with KDE Plasma
- Plasma Bigscreen - TV-friendly 10-foot UI as the default session
- Auto-login - Automatically logs into Plasma Bigscreen on first boot after install
- Pre-installed packages - Firefox,
plasma-bigscreen, Flatpak support - Pre-installed Flatpaks - VacuumTube, Plex HTPC, Stremio, Kodi, Flathub remote configured
- Bigscreen favorites - All apps pre-pinned to the Plasma Bigscreen home screen
- uBlock Origin - Auto-installed in Firefox via enterprise policy
- Auto-updates - Daily
bootc upgrade+flatpak updatevia systemd timer - Anaconda ISO - Full KDE installer with interactive setup (user creation, disk partitioning, etc.)
- Laptops
- Prevent sleep, suspend, and hibernation(lid can be closed while HDMI remains active)
- Prevent audio from cutting out after idle
- Download the latest ISO (GitHub account needed) from the Actions page: click the latest run(first on the list) → Artifacts or build it (see Dev section).
- Extract the artifact to get install.iso and use it in Fedora Media Writer or a similar program to burn the ISO into a flash drive
- Boot the ISO and go through the Anaconda installer
- On first boot, you'll be auto-logged into Plasma Bigscreen
sudo bootc switch ghcr.io/douglascdev/bluehtpc:latest
sudo rebootpodmanandjustinstalledsudoaccess
git clone https://github.com/douglascdev/blueHTPC
cd blueHTPCjust buildOr build as root (to rebase directly):
sudo just build# Build ISO (builds container image + ISO in one step)
sudo just rebuild-iso
# Build QCOW2
sudo just rebuild-qcow2# Build the ISO first
sudo just rebuild-isoOpen GNOME Boxes, click + → Import Image, and select output/bootiso/install.iso.
The ISO runs the Anaconda installer. Once installed, the VM will boot into blueHTPC with Plasma Bigscreen on each subsequent start.
After installing from the ISO once, you can iterate on changes without rebuilding the ISO:
# 1. Build the updated image locally
sudo just build
# 2. Push to a test tag (keeps :latest clean for production)
# GH_TOKEN -> a github PAT with write:packages scope
sudo podman login ghcr.io -u login -p "$GH_TOKEN"
sudo podman push localhost/bluehtpc:latest ghcr.io/douglascdev/bluehtpc:testing
# 3. In the VM, switch to the test tag and reboot
sudo bootc switch ghcr.io/douglascdev/bluehtpc:testing
sudo rebootProduction systems pinned to :latest are unaffected. Once you're satisfied, push to :latest for production rollout.
Edit build_files/build.sh and add packages to the dnf5 install line for RPMs, or a new flatpak install line for Flatpaks:
dnf5 install -y firefox flatpak plasma-bigscreen my-new-package
flatpak install -y com.example.MyAppEdit system_files/etc/skel/.config/bigscreen-favs. Each entry has an index ([Favs][N]) followed by fields describing the app launcher. To add a new app, append a new block with the next index. The desktopPath and entryPath should match the app's .desktop file:
[Favs][5]
categories=AudioVideo
comment=My App description
desktopPath=/var/lib/flatpak/exports/share/applications/com.example.MyApp.desktop
entryPath=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=myapp com.example.MyApp
icon=com.example.MyApp
name=My App
startupNotify=false
storageId=com.example.MyApp.desktopFor system (non-Flatpak) apps, desktopPath goes under /usr/share/applications/ and entryPath is the command directly.
Drop files into system_files/ mirroring the root filesystem layout. They are copied to / during the build. For example:
system_files/etc/firefox/policies/policies.json→/etc/firefox/policies/policies.jsonsystem_files/usr/lib/systemd/system/my-service.service→/usr/lib/systemd/system/my-service.service
Then enable any new systemd units in build_files/build.sh:
systemctl enable my-service.serviceEdit disk_config/iso-kde.toml to change Anaconda kickstart behavior or installer modules. The bootc switch line in the %post section determines which image gets installed - update it if you push to a different registry or image name.
Push to main - the build.yml workflow automatically builds and pushes to GHCR. Trigger the build-disk.yml workflow manually from the Actions tab to produce ISOs and QCOW2 images as downloadable artifacts.