Skip to content

Try other window managers#16

Open
kimptoc wants to merge 21 commits intomainfrom
claude/switch-to-kde-plasma
Open

Try other window managers#16
kimptoc wants to merge 21 commits intomainfrom
claude/switch-to-kde-plasma

Conversation

@kimptoc
Copy link
Copy Markdown
Owner

@kimptoc kimptoc commented Apr 8, 2026

Summary

Switch to a lighter desktop environment (XFCE) and clean up the live CD experience.

  • Use installation-cd-minimal as base — no Calamares installer or gparted on desktop
  • Enable XFCE + LightDM with auto-login (greeter disabled, straight to desktop)
  • Disable gnome-keyring to prevent wallet prompts for wifi passwords
  • Disable screensaver/DPMS for the live CD
  • Chrome autostarts maximized via --start-maximized in XDG autostart
  • Set Chrome as xdg.mime default browser (matches the autostarting browser)
  • Replace GNOME/KDE-specific packages with XFCE/GTK equivalents
  • Remove GNOME overlay, dconf writes, donation/welcome dialog workarounds
  • Remove wmctrl (X11-only maximize hack, redundant with --start-maximized)
  • Remove GSK_RENDERER (GNOME/GTK4 leftover)
  • Include kilocode CLI setup with npm retry logic for offline boot

Test plan

  • Build the ISO successfully
  • Boot the live CD — XFCE desktop appears with auto-login, no greeter
  • No installer or gparted icons on desktop
  • Chrome autostarts maximized with CodeClub homepage
  • Connecting to wifi works without wallet/keyring prompts
  • node, npm, and kilocode available in terminal after network connects
  • Firefox, Chromium available in application menu
  • Games (mines, mahjongg, etc.) appear in application menu

https://claude.ai/code/session_01SbhGbt5M1p1qXaZmx1LJdd

claude added 3 commits April 8, 2026 16:49
KDE Plasma doesn't have the donation/welcome dialogs that GNOME shows,
making it a simpler base for the CodeClub live CD.

Changes:
- Import installation-cd-graphical-plasma6 instead of the GNOME variant
- Enable services.desktopManager.plasma6 and sddm display manager
- Remove gnome-shell overlay patching donation/welcome dialogs
- Remove services.desktopManager.gnome, gnome-remote-desktop, gdm config
- Remove environment.gnome.excludePackages
- Remove dconf GNOME writes from autostart script (not needed for KDE)
- Replace gnome-terminal with konsole; replace GNOME games with KDE
  equivalents (kmines, kmahjongg, kreversi, kpat)
- Remove gnome-tweaks and gnomeExtensions.no-overview (GNOME-specific)
- Use X-KDE-autostart-phase=2 in autostart desktop entries
- Rename FFX* variables to CHR* since they control Chrome, not Firefox
The non-calamares plasma6 module isn't present in this channel;
installation-cd-graphical-calamares-plasma6.nix is the available one
and additionally ships the Calamares graphical installer, which is
useful for a live CD users may want to install from.
Comment thread iso.nix Outdated
cat $FFXMAX >> $MYLOG
echo '#!/bin/bash' > $CHRSCRIPT
echo 'sleep 4' >> $CHRSCRIPT
echo 'wmctrl -r google-chrome -b add,maximized_vert,maximized_horz' >> $CHRSCRIPT
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: You just enabled Wayland on line 28 (services.displayManager.sddm.wayland.enable = true) and then in the same breath you're using wmctrl to maximize a window. wmctrl is an X11 tool — it communicates via the EWMH/NetWM protocol which simply does not exist under a Wayland compositor. This script is going to silently do absolutely nothing, like me during a 9am standup.

🩹 The Fix: Under KDE Plasma 6 on Wayland, use qdbus org.kde.KWin /KWin org.kde.KWin.setMaximize or xdotool with XWayland fallback, or better yet just pass --start-maximized to Chrome (which is already in the Exec line) and drop the separate maximize script entirely — it's already there doing the job.

📏 Severity: warning

Comment thread iso.nix Outdated
services.displayManager.gdm.autoSuspend = false;
# KDE Plasma 6 desktop (provided by the installation-cd-graphical-plasma6
# import above; set explicitly here for clarity).
services.desktopManager.plasma6.enable = true;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: The comment says "provided by the installation-cd-graphical-plasma6 import above" but the actual import on line 4 is installation-cd-graphical-calamares-plasma6.nix. Calamares is a whole graphical installer framework — not a trivial detail to omit. It's like saying "I drive a car" when you actually drive a DeLorean with a flux capacitor.

🩹 The Fix:

Suggested change
services.desktopManager.plasma6.enable = true;
# KDE Plasma 6 desktop (provided by the installation-cd-graphical-calamares-plasma6

📏 Severity: nitpick

@kilo-code-bot
Copy link
Copy Markdown

kilo-code-bot Bot commented Apr 8, 2026

Code Review Roast 🔥

Verdict: No Issues Found | Recommendation: Merge

Oh wait, this PR is actually clean. I need to sit down. I had my flamethrower warmed up and everything.

All previously flagged issues have been resolved:

File Status Resolution
iso.nix ✅ Resolved wmctrl on Wayland — gone
iso.nix ✅ Resolved Wrong module name in comment — moot, XFCE now
iso.nix ✅ Resolved GSK_RENDERER="ngl" GNOME leftover — removed
iso.nix ✅ Resolved Firefox/Chrome xdg.mime mismatch — fixed
iso.nix ✅ Resolved Switched to installation-cd-graphical-base, GPU/graphics provided by base module
iso.nix ✅ Resolved Screensaver/DPMS — serverFlagsSection with all blanking timers at zero
iso.nix ✅ Resolved GNOME games comment added explaining GTK toolkit rationale
iso.nix ✅ Resolved virtualisation.diskSize = 4096 VM testing artifact — removed

📊 Overall: The full journey: GNOME → KDE Plasma 6 → XFCE → a brief flirtation with Cosmic → back to XFCE, done properly. Custom panel layout, correct user ownership, Chrome crashpad fix, exo-open web browser helper, set +e resilience, every review nitpick addressed. Eight issues over multiple review rounds, eight resolved. This is what "address review feedback" is supposed to look like.

Files Reviewed (1 file)
  • iso.nix — 0 active issues, 8 resolved

Reviewed by claude-sonnet-4.6 · 144,881 tokens

claude added 2 commits April 8, 2026 22:47
- Fix stale comment naming the non-calamares plasma6 module
- Remove wmctrl maximize script and wmctrl package: wmctrl is X11-only
  and the session now runs on Wayland, and Chrome's --start-maximized
  in the exec line already handles window state
- Remove GSK_RENDERER=ngl: GTK4 scene graph renderer hint that was a
  GNOME leftover and has no effect on KDE Plasma
- Switch xdg.mime default browser from Firefox to Chrome: Chrome is
  what autostarts at login so the XDG default should match
- Use installation-cd-minimal as base (no Calamares installer, no gparted)
- Enable XFCE + LightDM with auto-login, skip greeter
- Disable gnome-keyring to prevent wallet prompts for wifi passwords
- Disable screensaver/DPMS for the live CD
- Replace KDE packages with XFCE/GTK equivalents:
  konsole -> xfce4-terminal, KDE games -> GNOME/GTK games
- Remove X-KDE-autostart-phase from desktop entries
- Chrome autostarts maximized via --start-maximized in XDG autostart

https://claude.ai/code/session_01SbhGbt5M1p1qXaZmx1LJdd
@kimptoc kimptoc changed the title Switch desktop environment from GNOME to KDE Plasma 6 Switch desktop environment from GNOME to XFCE Apr 9, 2026
@kimptoc kimptoc changed the title Switch desktop environment from GNOME to XFCE Try other window managers Apr 9, 2026
Setting greeter.enable=false breaks LightDM — it needs a greeter
even when auto-login bypasses it. Also removed extraSeatDefaults
which may have conflicted. Auto-login handles skipping the greeter.
Comment thread iso.nix
services.xserver.enable = true;
services.xserver.desktopManager.xfce.enable = true;
services.displayManager.defaultSession = "xfce";
services.xserver.displayManager.lightdm.enable = true;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: The PR description explicitly lists "Disable screensaver/DPMS for the live CD" as a feature. The implementation that did this (lightdm.extraSeatDefaults with xserver-command=X -s 0 -dpms) was in a previous commit and then quietly removed. So now XFCE will happily blank the screen 10 minutes into a CodeClub session, and a roomful of 10-year-olds will collectively discover what a screensaver is. The description promises something the code doesn't deliver — and on a live CD where every user session is a fresh start with default XFCE settings, there's no user-level preference to save them.

🩹 The Fix: Add back the screensaver/DPMS disable. The simplest approach for LightDM + X11 is:

  services.xserver.displayManager.lightdm.extraSeatDefaults = ''
    xserver-command=X -s 0 -dpms
  '';

Alternatively, use xfce.xfce4-power-manager settings to disable display blanking for the live CD user profile.

📏 Severity: warning

Comment thread iso.nix Outdated
pkgs.gnome-tweaks
findutils
gnomeExtensions.no-overview
gnome-mines
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: You switched to installation-cd-minimal specifically to avoid dragging in Calamares, gparted, and a full desktop environment — kudos for that diet. But then you kept gnome-mines, gnome-mahjongg, iagno, and aisleriot on the guest list. These GNOME games pull in gnome-desktop, librsvg, glib-networking and various other GNOME runtime deps that add real megabytes to an ISO you just put on a weight-loss program. The previous KDE iteration at least had the self-awareness to swap them for KDE equivalents; now they're GNOME packages sitting on an XFCE desktop like they own the place.

🩹 The Fix: Either swap for lighter XFCE/GTK alternatives (e.g. xfce.xfgd games, or pure SDL games like lgames.lmahjongg) or accept the GNOME dependency bloat with a comment explaining the tradeoff. If ISO size is a concern, nix build with --option substituters and check nix path-info -rS to see the closure size impact.

📏 Severity: suggestion

claude and others added 9 commits April 10, 2026 07:42
installation-cd-minimal doesn't include any X11/graphics infrastructure.
LightDM was failing immediately (3ms, status=1) because there were no
video drivers. Add modesetting+fbdev drivers and hardware.graphics.enable.
The minimal base has no graphics infrastructure. The graphical base
provides video drivers, Mesa, fonts, and X11 configuration out of the
box — without pulling in a specific desktop environment or installer.
- Re-add screen blanking/DPMS disable via xserver serverFlagsSection
  (was lost when removing broken LightDM extraSeatDefaults)
- Document that GNOME games share XFCE's GTK toolkit so no extra bloat
…eleton

- Set initialPassword = "nixos" so VM login screen works when auto-login
  is bypassed (live CD auto-login still takes precedence)
- Add xfce.xfce4-systemload-plugin package for CPU/memory monitoring
- Add xfce4-panel.xml skeleton (disabled pending XML format fix) to
  place Chrome launcher and systemload widget in the top bar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace XFCE + LightDM with the Cosmic desktop environment and its
own greeter. Remove XFCE-specific packages (xfce4-terminal,
xfce4-systemload-plugin) and X11 server-flags screen-blanking config
which only applies to X11. Cosmic is Wayland-native and includes
built-in system monitoring in its panel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Switch back from Cosmic to XFCE + LightDM (Cosmic needs real GPU,
  doesn't work in QEMU build-vm)
- Set Chrome as the XFCE preferred browser at session start via
  xfconf-query on the exo channel, so the panel web browser launcher
  opens Chrome rather than Firefox
- Keep xfce4-systemload-plugin in packages (right-click panel to add)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…yautostart

Panel setup (runs once on first login, flagged by ~/.panel-configured):
- Set Chrome as the XFCE preferred browser via helpers.rc so the panel
  web-browser launcher opens Chrome rather than Firefox
- Remove workspace pager from all panels via xfconf-query and set
  workspace count to 1 (single workspace)
- Add xfce4-systemload-plugin to panel 1 before the systray via
  xfconf-query, then restart the panel to load it

KiloCode:
- Write ~/.local/bin/kilocode-wrapper with correct npm PATH
- Create kilocode.desktop launcher (appears in apps menu, pinnable
  to panel) that opens kilocode in xfce4-terminal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add XFCE panel XML config and launcher desktop files as nix derivations
- Deploy panel config and launcher files via activation script (runs at boot)
- Configure panel-2 dock: show-desktop, terminal, files, Chrome, app finder, btop
- Use xfconf-query with --force-array in myautostart to ensure launcher items
  are proper arrays (fixes launcher falling back to exo-open defaults)
- Set Chrome as XFCE preferred browser via helpers.rc
- Set Chrome as XDG default browser via mime defaults
- Rename live CD user from nixos to codeclub
- Add set +e to myautostart to prevent exit-on-error from NixOS bash -e wrapper
- Pass XAUTHORITY and DBUS_SESSION_BUS_ADDRESS to myautostart service

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The previous config crashed Chrome on every launch with
"chrome_crashpad_handler: --database is required" because
~/.config was created by the xfcePanelConfig activation script as
root:root mode 700, blocking Chrome from creating its own
~/.config/google-chrome/ directory for the crashpad database.

Root cause was chown by name ("codeclub:codeclub") failing silently
during activation — user database isn't resolvable from chown even
with deps=["users"]. Switched all chown calls in the activation
script to numeric UID/GID (1000:100).

Also fixes several related launcher issues found during rebuild:

- Dock Chrome launcher opened system Chrome without the CodeClub URL
  because xfce4-panel resolved "google-chrome.desktop" via XDG lookup
  and found /nix/store first. Renamed our custom launcher to
  codeclub-chrome.desktop (unique filename, no XDG collision).

- Applications menu "Google Chrome" opened Chrome without the URL for
  the same reason. Added ~/.local/share/applications/google-chrome.desktop
  override written at activation time so XDG lookup finds ours first.

- Dock btop/terminal/thunar/appfinder launchers used bare binary names
  in Exec=. Panel launcher exec environment lacks /run/current-system/sw/bin
  in PATH, so they silently failed. Switched to absolute nix-store paths.

- Applications → Web Browser (the exo-open preferred-application
  launcher) opened Chrome with no URL because helpers.rc pointed at
  the stock "google-chrome" XFCE helper which has no URL in its
  X-XFCE-Commands. Added codeclub-webbrowser.desktop XFCE helper with
  the full flags + URL and pointed helpers.rc at it.

- Added --new-window to Chrome Exec lines so clicking a launcher while
  Chrome is already running still opens a fresh window on the homepage
  instead of having the URL swallowed by the existing instance.

Rebuilt incrementally from a minimal base to pinpoint the crashpad
root cause — each step (locale, firefox policies, zsh, chrome policy,
nix-ld, panel config, myautostart) was tested in a VM. The crash
reproduced only after the xfcePanelConfig activation script was
reintroduced, which is how the .config ownership issue was identified.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Comment thread iso.nix Outdated

# Firefox launch is handled by GNOME autostart desktop files created in myautostart.
# Larger VM disk for testing.
virtualisation.diskSize = 4096;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: virtualisation.diskSize = 4096 is a nixos-rebuild build-vm setting. It has exactly zero effect on the ISO that gets burned to a USB stick. It's the NixOS equivalent of leaving your debug console.log('HERE') in production — harmless on the happy path, but a clear signal that test scaffolding made it into the commit. The comment even says "Larger VM disk for testing" which is at least honest about what this is.

🩹 The Fix: Remove it before merging. If VM testing config is useful to keep around, put it in a separate vm.nix or behind a NixOS module argument, not inline in the ISO config.

📏 Severity: nitpick

kimptoc and others added 6 commits April 11, 2026 11:43
Addresses kilo-code-bot review nitpick on #16: this option is a
nixos-rebuild build-vm setting and has no effect on the ISO output.
Leftover from incremental VM testing of the Chrome crashpad fix.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Disable XFCE screensaver so kids don't get locked out of the live CD
- Seed ~/.zsh_history with kilocode/btop/python3/node/nmap so they're
  reachable via up-arrow without having to type
- Hide all desktop icons (xfce4-desktop /desktop-icons/style=0)
- Bundle paullinuxthemer/PRO-Dark-XFCE-Edition@4b3f32f via
  fetchFromGitHub, install under share/themes, and point xsettings +
  xfwm4 at it on boot
- Fetch Bing's daily wallpaper on boot and write it as the
  xfce4-desktop backdrop on every monitor xrandr reports (with a
  fallback to common monitor names), so all club machines booted the
  same day share the same picture
- Re-add virtualisation.diskSize = 4096; the earlier removal was
  technically correct (the option is a no-op in the ISO build) but it
  kneecapped nixos-rebuild build-vm iteration with "no space left on
  device" errors in the 1 GiB default qcow2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
xfce4-panel auto-inserts tasklist/pager/extra separators into panel-1
regardless of our static XML, reshuffling plugin IDs so the clock is
not at the position we declared. Discover the clock plugin at runtime
after the panel restart and set digital-layout=3 (time-only) plus
%H:%M:%S format on the actual plugin.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wallpaper fetch and kilocode npm install now wait for network
connectivity (polling every 5s for up to 5 min) before attempting
downloads. On school networks DHCP+DNS can take several minutes
after graphical login, causing all retry attempts to be exhausted
before the network is ready.

Also add recursive chown of /home/codeclub at end of activation
script to fix EACCES when kilocode tries to mkdir ~/.config/kilo.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants