Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Set up Nix/NixOS for classroom laptops - #17

Open
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main
Open

Set up Nix/NixOS for classroom laptops#17
bottd wants to merge 5 commits into
WeAllCode:mainfrom
bottd:main

Conversation

@bottd

@bottdbottd commented Mar 23, 2026

Copy link
Copy Markdown

Summary

Replaces the previous scripts for macOS config with a NixOS flake configuration for the classroom laptops (Intel MacBooks).

We ran into issues getting programs to run consistently across these machines, especially because modern versions of MacOS do not support these MacBooks. With Linux we can run an up-to-date system on legacy hardware. NixOS lets us declare the entire system config in code so every laptop is identical.

Omar and I have successfully installed this configuration on the laptops that have USB-A ports. During setup we verified that Python with tkinter runs successfully in VS Code, all VS Code extensions are installed, and AI features are turned off.

Included in this PR:

NixOS system config

  • XFCE desktop

  • WeAllCode wallpaper

  • auto-login

  • Python 3

    • tkinter
    • weallcode_robot
    • rich (used in scripts)
  • VS Code

    • correct Python interpreter path set
    • AI features disabled
    • Ruff
    • Pylance
    • Prettier
  • Firefox

  • Broadcom WiFi driver

Bootable installer ISO

  • GitHub Action builds installation .iso
  • Boots into XFCE with a Classroom Setup shortcut that partitions the disk and installs NixOS

Classroom Update script

  • Desktop shortcut that rebuilds the system from the latest config on GitHub and installs weallcode-robot via pip

Renovate

  • Monthly automated dependency updates for flake inputs and GitHub Actions

Dev environment

  • direnv sets up a dev shell with linting/formatting for nix, python, and yaml.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the classroom laptop setup from macOS bootstrap scripts to a declarative NixOS flake that can be built into both an installable system configuration and a bootable installer ISO for Intel MacBooks.

Changes:

  • Introduces a NixOS flake with modular system configuration (XFCE desktop, VS Code, Python, networking, Broadcom WiFi).
  • Adds a GitHub Actions workflow to build and publish a bootable installer ISO plus a Python-based install/update flow.
  • Adds Renovate + dev tooling (direnv + treefmt/pre-commit), and removes the legacy macOS provisioning artifacts.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
settings.jsonRemoves legacy macOS VS Code settings bootstrap file.
org.weallcode.logon.plistRemoves legacy macOS LaunchAgent.
logon.script.shRemoves legacy macOS logon script.
install.shRemoves legacy macOS installation script.
.zshrcRemoves legacy macOS zsh customization.
flake.nixDefines flake inputs, dev tooling (treefmt/pre-commit), and NixOS/ISO outputs.
flake.lockPins flake inputs for reproducible builds.
modules/base.nixMain classroom NixOS configuration, packages, Home Manager wiring, update shortcut.
modules/disk.nixDisk partitioning layout for disko-based installs.
modules/hardware-configuration.nixHardware/boot settings targeting Intel MacBooks (incl. Broadcom import).
modules/broadcom.nixEnables Broadcom STA driver and related kernel module settings.
modules/networkmanager.nixEnables NetworkManager and configures system-wide WiFi connection storage.
modules/nix-settings.nixSets Nix daemon settings, substituters, and GC defaults.
modules/python.nixProvides Python environment (tkinter/rich/pip) for classroom usage and scripts.
modules/vscode.nixHome Manager VS Code config: extensions, interpreter path, AI feature disabling, editor defaults.
modules/xfce.nixXFCE desktop setup: autologin, wallpaper, panel/launcher config.
modules/iso.nixInstaller ISO configuration and desktop “Classroom Setup” shortcut.
scripts/machine-setup.pyInstaller-side script that partitions, installs NixOS from the flake, and reboots.
scripts/update.pyClassroom update script that rebuilds from GitHub flake and upgrades weallcode-robot via pip.
README.mdDocuments new NixOS-based install/update process and repo structure.
.envrcEnables direnv flake-based dev shell.
.gitignoreUpdates ignored files for direnv/pre-commit/ruff cache.
renovate.jsonAdds Renovate configuration for monthly dependency updates (incl. Nix).
.github/workflows/build-iso.ymlBuilds the installer ISO in CI and uploads it as an artifact.
.github/workflows/renovate.ymlRuns Renovate on a schedule / manually.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/update.py
Comment threadscripts/machine-setup.py
Comment threadmodules/python.nix
Comment threadmodules/base.nix
Comment threadmodules/iso.nix Outdated
Comment threadmodules/vscode.nix
@karbassi

Copy link
Copy Markdown
Member

@bottd can you look at the reviews from Copilot?

@bottd

bottd commented Apr 5, 2026

Copy link
Copy Markdown
Author

@karbassi I pushed changes to address the comments

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 26 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadrenovate.json
Comment threadmodules/nix-settings.nix
Comment threadmodules/networkmanager.nix Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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.

3 participants

@bottd@karbassi