# Development setup What the 29 projects in `~/Documents/Development` need on the new machine, mapped against what the image already provides. Scanned 2026-07 from each project's manifests, Dockerfiles, and setup scripts. Run [scripts/dev-setup.sh](scripts/dev-setup.sh) after first boot to install the toolchain layer in one shot. ## Already in the image — install nothing | Need | Provided by | Used by | |---|---|---| | Docker CE + compose, Podman, skopeo | Bazzite DX base | requester, serverTransfer, ispy, keyWord, encoderPro, movieScanner, kidstube, Docker-Registry-Browser, smartSpeaker… | | NVIDIA driver (610+ open) + container toolkit + CDI | base (nvidia image) | AIVoice, ispy, keyWord, encoderPro, smartSpeaker whisper, superBossMonster art pipeline | | qemu/KVM + virt tooling | DX base | BC250 VM testing | | android-tools (adb) | DX base | denon-bluetooth btsnoop captures | | Steam + Proton | Bazzite base | BG4_UltraWide_fix | | VS Code, git, Homebrew, just | DX base | everything | | BlueZ/bluetoothd, rsync, openssh | Fedora base | denon-bluetooth, serverTransfer | | Godot (current stable), Android Studio | first-boot Flatpaks | superBossMonster/FFCardGame, native-angular | AIVoice's `SETUP.md` warning about snap Docker / Docker Desktop is moot here: Bazzite DX ships native docker-ce, which is exactly what it wants. Its `nvidia-ctk runtime configure --runtime=docker` step is the same one in the README's GPU section. ## Toolchains — mise (all per-version needs found in the scan) No project commits `.nvmrc`/`.python-version`/`.tool-versions`, so versions below come from Dockerfiles and build configs. `dev-setup.sh` installs mise and these versions: - **Node 22** global default (requester, movieScanner); projects also reference 18 (Docker-Registry-Browser, movieMetaTagger) and 20 (FFCardGame server, kidstube) — installed side-by-side, pin per-project with `mise use node@18` in the project dir (writes `mise.toml` — worth committing so this guesswork ends). - **Python 3.12** (serverTransfer, movieMetaTagger, movieScanner, nameFixer4000, BG4 tools) and **3.11** floor (FRScanner). Fedora 44's system python is newer — don't rely on it for these. - **JDK 21** (villager-logic-fix, Minecraft-Village-Warriors release target), **JDK 17** (native-angular android-host), **JDK 25** (Minecraft-Village-Warriors toolchain — Gradle can also auto-provision it). Gradle itself always via each repo's wrapper. - **.NET 10 SDK** (requester; also rebuilds the BG4 BepInEx plugin). - **Go** and **Rust** — present on the old machine (`~/go`, `~/.cargo`); no scanned project pins a version, so latest. ## Native builds — use a distrobox, not the host Compilers and C library headers don't belong on the atomic host. One Fedora distrobox covers every native-build need the scan found: ```bash distrobox create dev --image registry.fedoraproject.org/fedora:44 distrobox enter dev sudo dnf install -y gcc gcc-c++ make cmake pkgconf python3-devel \ gtk4-devel \ # native-angular linux-host (CMake + GTK4) zbar \ # DVDPhotoMatic (pyzbar) libsndfile mediainfo-libs \ # FRScanner audio / movieMetaTagger pymediainfo rtl-sdr rtl-sdr-devel \ # FRScanner RTL-SDR + Cython builds mkvtoolnix ffmpeg-free \ # movieMetaTagger mkvpropedit; ffmpeg fallback python3-tkinter python3-dbus \ # denon-bluetooth GUI flashrom # BC250 BIOS flashing (CH347 over USB) ``` Native node modules (kidstube's better-sqlite3, FFCardGame's bcrypt) build fine inside the distrobox too — or in their Docker builds, which is how they ship anyway. ## Host-level odds and ends - **RTL-SDR udev rules** (FRScanner): the dongle permissions must live on the *host* — `dev-setup.sh` writes `/etc/udev/rules.d/20-rtlsdr.rules` (`/etc` is mutable and survives updates). - **ffmpeg on the host** (audioSticher, AIVoice host venv, encoderPro host runs): Bazzite ships ffmpeg — verify with `ffmpeg -version`; if a project needs full codecs beyond it, `brew install ffmpeg` wins on PATH. - **Pinned Godot binaries**: superBossMonster hardcodes `~/godot/Godot_v4.3-stable_linux.x86_64` and FFCardGame ships its own 4.2 binary. Keep the `~/godot/` directory from the old machine (plus export templates in `~/.local/share/godot/`); the Flatpak is only "current stable". - **gh CLI**: `brew install gh` (in `dev-setup.sh`) — used across projects. - **BlueBuild CLI** (BC250 and this repo): the installer one-liner in the README. - **API keys**: ANTHROPIC_API_KEY (FFCardGame tools, DVDPhotoMatic), TMDB/OMDB (movieScanner, nameFixer4000, DVDPhotoMatic), YouTube Data v3 (kidstube) — carried in per-project `.env` files; bring them over with your home directory. ## Per-project cheat sheet | Project | Needs beyond the image | |---|---| | AIVoice | py3.12 venv (mise), ffmpeg, GPU containers (covered) | | AIVoices_HA, personal-landing, cardscraper, audioSticher, teamsTrick | nothing / stdlib python | | BC250 | BlueBuild CLI, flashrom (distrobox) | | BG4_UltraWide_fix | .NET 10, py3.12, Steam/Proton (covered) | | denon-bluetooth | distrobox tkinter+dbus, adb (covered) | | Docker-Registry-Browser | Node 18 | | DVDPhotoMatic | finished project — py3.12, zbar (distrobox), webcam if ever revived; OpenSCAD flatpak for the jig files if needed | | encoderPro, ispy, keyWord, movieScanner, nameFixer4000, serverTransfer | Docker (+GPU) only | | FFCardGame | Godot 4.2 binary, Node 20, python+anthropic | | FRScanner | py3.11+, rtl-sdr distrobox + host udev rules | | kidstube | Node 20 (+distrobox for native build outside Docker) | | Minecraft mods (×2) | JDK 21/25 via mise | | movieMetaTagger | py3.12, Node 18, mkvtoolnix/mediainfo (distrobox) | | native-angular | Node 20+, JDK 17, Android Studio (flatpak), GTK4 distrobox | | requester | .NET 10, Node 22, postgres via compose | | smartSpeaker | Docker (covered); Pi hardware is remote | | superBossMonster | Godot 4.3 binary + templates, ComfyUI in GPU container | | teamsTrick | X11 session note: KDE on Bazzite defaults to Wayland — run it in an X11 session or expect XTest to fail |