# bc250-console A custom [Bazzite](https://bazzite.gg) GNOME (bootc) image for the **AMD BC-250**, built as a kid-friendly couch gaming console with remote parent administration. Recipes build with [BlueBuild](https://blue-build.org); the installer ISO comes from bootc-image-builder; installed consoles update over-the-air from this Gitea's container registry. **Image:** `git.lazypugs.com/ckoch/bc250-console-gnome:latest` **Recipe:** [`recipes/bc250-console-gnome.yml`](recipes/bc250-console-gnome.yml) ## What it adds on top of `bazzite-gnome:stable` | Area | Change | |---|---| | GPU | `cyan-skillfish-governor-smu` (BC-250 DVFS governor, from the [filippor COPR](https://copr.fedorainfracloud.org/coprs/filippor/bazzite/)), enabled | | Memory | `ttm.pages_limit` / `ttm.page_pool_size` kargs so the GPU can use the full 16 GB shared GDDR6 | | Remote admin | `openssh-server` (enabled); **Sunshine** auto-serves the kid's session to Moonlight; `tailscaled` enabled. (RDP via `bc250-remote-setup` exists but is blocked by a mutter/GFX1013 crash) | | Console behavior | All suspend paths masked, no screen lock/dim, GNOME animations off — always on, always reachable | | Kid experience | Steam Big Picture autostarts for the `kid` account only | | Apps | First-boot flatpaks: ProtonUp-Qt, Heroic, RetroDECK, Prism Launcher (Minecraft), Chromium, Moonlight — Steam, Firefox, auto-updates already in the Bazzite base | | Cloud gaming | GeForce NOW via a Chromium web-app shortcut (the native GFN app requires Vulkan video decode the BC-250 physically lacks — error 0xC0F11312). Moonlight client included for streaming from a home Sunshine host. Streams CPU-decode; keep to 1080p | | Fixes | `hhd.service` masked (crash-loops on BC-250) | | Docs | Parent manual baked at `/usr/share/doc/bc250-console/OPERATIONS.md` | ## Accounts Build with [`build-console.sh`](build-console.sh) + your `console.env` to bake real usernames, passwords, and display names directly into the ISO (see BUILD-CONSOLE.md). Without it, the ISO bakes the placeholder users from [`iso-config.toml`](iso-config.toml): `parent` (admin/wheel) and `kid` (standard), passwords to change on first login. The kid's account can be renamed post-install (see OPERATIONS.md) — the Big Picture autostart follows `CONSOLE_KID_USER` in `/etc/bc250-console.conf`. > ⚠️ The installer wipes the first disk with no prompts. Don't boot it on a > machine whose disk you care about. ## Documentation - [`BUILD-CONSOLE.md`](BUILD-CONSOLE.md) — build the image, generate the ISO, publish OTA updates (verified podman and docker paths, with workarounds) - [`OPERATIONS.md`](OPERATIONS.md) — day-2 admin: connecting, installing games remotely, updates/rollback, GPU tuning, health checks - [`WIRING.md`](WIRING.md) — PSU/mains wiring, J1000 pinout, power-switch design (AC rocker + AUTO_PWRON), fans, first power-on - [`BIOS-FLASH.md`](BIOS-FLASH.md) — backup + flash the modded firmware via the J4004 header, then the VRAM/IOMMU settings (ROMs are local-only, not in this repo) ## Hardware prerequisites (on the board, not in the image) Modded BIOS (see [mothenjoyer69/bc250-documentation](https://github.com/mothenjoyer69/bc250-documentation)), then BIOS settings: 512 MB dynamic VRAM, IOMMU disabled, auto power-on. ## Known issues (found the hard way on real hardware) All of these are worked around in this image; listed here for searchability and until fixed upstream. - **GNOME Remote Desktop (RDP/VNC) crashes the whole session** on this GPU: `gnome-shell` SIGSEGV in `meta_cursor_renderer_get_cursor` via `meta_screen_cast_monitor_stream_src_set_cursor_metadata` (mutter 50.3, cyan-skillfish/GFX1013) the moment a client connects and requests cursor-metadata frames. `MUTTER_DEBUG_DISABLE_HW_CURSORS=1` does **not** help. *Workaround: Sunshine + Moonlight instead (baked). Upstream report to GNOME/mutter: pending.* - **Sunshine crash-loops (SIGSEGV, exit 139) probing the Vulkan H.264 encoder** on a GPU with no video-encode hardware, instead of falling through to the next encoder. *Workaround: `encoder = software` seeded before first start (baked). Upstream report to LizardByte: pending.* - **GeForce NOW's native Linux app cannot run** — error `0xC0F11312`: the client hard-requires Vulkan video-decode extensions and the BC-250's silicon has no VCN block at all. Unfixable at the driver level. *Workaround: GFN via Chromium web app (baked shortcut).* - **BlueBuild `default-flatpaks@v1` `notify: true` breaks on multi-user systems**: the post-install notification runs `sudo -u` with all human users newline-joined into one name, failing the whole install service. *Workaround: `notify: false`. Upstream report: pending.* - **Bazzite's `bazzite-steam-bpm` shows "ERROR: code=0; This is strange..."** at login when Steam lingers from a previous session: a `waitpid` race on already-gone PIDs plus an `if !` clobbering `$?`. *Workaround: this image ships its own quit-and-wait wrapper.* - Cosmetic: `amdgpu` logs a wall of `hpd(rx)`/`dal_irq` errors at every boot on BC-250 — the display core probes IRQ sources this cut-down chip lacks. Harmless; every BC-250 does this. ## Roadmap / hoped-for work - File the four upstream bug reports above (coredumps and stack traces are in hand). - In-home game streaming: Sunshine host VM (R730, RTX 3050 passthrough) serving the baked Moonlight client — self-hosted "GeForce NOW" at LAN latency. Fortnite stays on real GFN (Epic's anti-cheat policy). - Thermal soak validation and GPU governor ceiling tuning (see OPERATIONS.md) once long gaming sessions accumulate. - Retry GNOME RDP after a fixed mutter ships; retry native GFN if NVIDIA adds a software-decode fallback. - Explicit non-goal: the experimental 40-CU unlock — this console stays on the stable 24-CU configuration. ## Credits Forked from [62fixolab/Latest-Bazzite-AMD-BC-250-Patched-Images](https://github.com/62fixolab/Latest-Bazzite-AMD-BC-250-Patched-Images), which builds on [vietsman's patched images](https://github.com/vietsman/bazzite-gnome-patched) and [filippor/cyan-skillfish-governor](https://github.com/filippor/cyan-skillfish-governor), on top of [ublue-os/bazzite](https://github.com/ublue-os/bazzite). The 40-CU experimental tooling from upstream is intentionally not included — this image stays on the stable 24-CU configuration. MIT licensed — see [LICENSE](LICENSE) and [NOTICE](NOTICE).