From 5ea3384880bacedbfb6d1068850f0a073ebbcb0c Mon Sep 17 00:00:00 2001 From: ckoch Date: Thu, 30 Jul 2026 09:45:37 -0400 Subject: [PATCH] Dev toolchain scan: DEVELOPMENT.md, dev-setup.sh, OpenSCAD + Android Studio flatpaks Co-Authored-By: Claude Fable 5 --- DEVELOPMENT.md | 103 +++++++++++++++++++++++++++++++++++++++++++ README.md | 15 +++++-- recipes/recipe.yml | 2 + scripts/dev-setup.sh | 35 +++++++++++++++ 4 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 DEVELOPMENT.md create mode 100755 scripts/dev-setup.sh diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..1d4cf0b --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,103 @@ +# 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), OpenSCAD, Android Studio | first-boot Flatpaks | superBossMonster/FFCardGame, DVDPhotoMatic jigs, 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 | py3.12, zbar (distrobox), OpenSCAD (flatpak), webcam | +| 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 | diff --git a/README.md b/README.md index 73966ac..4c4d12d 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ publishing signed images to a registry later is just a `bluebuild build --push` (the proprietary module says `NVIDIA`). Blackwell only works on the open modules. 2. **Deployment:** `rpm-ostree status` shows the booted deployment is the local build (`ostree-unverified-image:oci-archive:/etc/bluebuild/...`) with the expected base version. -3. **Flatpaks:** all installed (`flatpak list --system` — 21 apps from the list below). The +3. **Flatpaks:** all installed (`flatpak list --system` — 23 apps from the list below). The first-boot install is sequential and multi-GB; on slow links it can take 15+ minutes after first login. Progress: `journalctl -b --grep flatpak -f`. 4. **Docker group:** run `ujust dx-group` (adds you to `docker` and friends), then log out/in. @@ -93,13 +93,15 @@ Installed system-wide from Flathub by the `default-flatpaks` module. All IDs ver Flathub (2026-07). **Official / verified listings:** Bambu Studio, Bitwarden, Discord, Firefox, Thunderbird, -FreeCAD, GIMP, HandBrake, LibreOffice, Moonlight, PCSX2 (`net.pcsx2.PCSX2` — the official -build), Podman Desktop, Prism Launcher, Warzone 2100, XIVLauncher (`dev.goats.xivlauncher`). +FreeCAD, GIMP, HandBrake, LibreOffice, Moonlight, OpenSCAD, PCSX2 (`net.pcsx2.PCSX2` — the +official build), Podman Desktop, Prism Launcher, Warzone 2100, XIVLauncher +(`dev.goats.xivlauncher`). **Community / unverified listings — know what you're running:** | App | ID | Note | |---|---|---| +| Android Studio | `com.google.AndroidStudio` | Community packaging of Google's IDE (not verified) | | GitHub Desktop | `io.github.shiftey.Desktop` | Community Linux fork; the "shiftey" spelling is the real ID | | MakeMKV | `com.makemkv.MakeMKV` | Community packaging of the proprietary app | | GeForce NOW | `io.github.hmlendea.geforcenow-electron` | **Unofficial** Electron wrapper, not an NVIDIA product | @@ -110,6 +112,13 @@ build), Podman Desktop, Prism Launcher, Warzone 2100, XIVLauncher (`dev.goats.xi **GeForce NOW on the 32:9 monitor:** the service only streams 16:9 (and some 21:9) aspect ratios, so expect pillarboxing at 5120x1440 — that's a service limitation, not a config problem. +## Development setup + +All 29 projects in `~/Documents/Development` were scanned for toolchain needs — the full +mapping (what the image covers, mise versions, the native-build distrobox, hardware udev rules) +is in [DEVELOPMENT.md](DEVELOPMENT.md). After first boot, run +[scripts/dev-setup.sh](scripts/dev-setup.sh) to set it all up. + ## Post-install steps (manual by design — don't automate these) ### PIA VPN — native WireGuard, not the app diff --git a/recipes/recipe.yml b/recipes/recipe.yml index d10b532..358ef84 100644 --- a/recipes/recipe.yml +++ b/recipes/recipe.yml @@ -36,11 +36,13 @@ modules: - net.wz2100.wz2100 - org.freecad.FreeCAD # current ID; old org.freecadweb.FreeCAD is dead - org.gimp.GIMP + - org.openscad.OpenSCAD # DVDPhotoMatic hardware jigs - org.libreoffice.LibreOffice - org.mozilla.Thunderbird - org.mozilla.firefox - org.prismlauncher.PrismLauncher # -- Community / unverified listings (see README) -- + - com.google.AndroidStudio # native-angular android-host (SDK 35 + NDK) - com.makemkv.MakeMKV - com.spotify.Client - io.github.hmlendea.geforcenow-electron # unofficial wrapper; 16:9/21:9 streams only diff --git a/scripts/dev-setup.sh b/scripts/dev-setup.sh new file mode 100755 index 0000000..8fc20b5 --- /dev/null +++ b/scripts/dev-setup.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# One-shot developer toolchain setup for the main-desktop image. +# Run as your user after first boot (safe to re-run). See DEVELOPMENT.md for the why. +set -euo pipefail + +echo "== Homebrew tools ==" +brew install mise gh cosign + +echo "== Toolchains (mise) ==" +mise use -g node@22 python@3.12 go@latest rust@latest java@temurin-21 dotnet@10 +mise install node@18 node@20 python@3.11 java@temurin-17 java@temurin-25 + +echo "== RTL-SDR udev rules (FRScanner) ==" +if [ ! -f /etc/udev/rules.d/20-rtlsdr.rules ]; then + sudo tee /etc/udev/rules.d/20-rtlsdr.rules >/dev/null <<'EOF' +# Generic RTL2832U (rtl-sdr) dongles — allow non-root access +SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", MODE="0666", TAG+="uaccess" +SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2832", MODE="0666", TAG+="uaccess" +EOF + sudo udevadm control --reload-rules +fi + +echo "== Native-build distrobox ==" +if ! distrobox list 2>/dev/null | grep -q '^.*| *dev '; then + distrobox create --yes dev --image registry.fedoraproject.org/fedora:44 + distrobox enter dev -- sudo dnf install -y gcc gcc-c++ make cmake pkgconf python3-devel \ + gtk4-devel zbar libsndfile mediainfo-libs rtl-sdr rtl-sdr-devel mkvtoolnix \ + python3-tkinter python3-dbus flashrom +fi + +echo "== Done ==" +echo "Remaining manual bits (see DEVELOPMENT.md):" +echo " - copy ~/godot/ (pinned 4.2/4.3 binaries) and ~/.local/share/godot/ from old machine" +echo " - bring per-project .env files (API keys)" +echo " - ujust dx-group (docker group), then re-login"