# Scobleclaw Laptop Config Nix flake that reproduces MacBook software capabilities on an x86\_64 NixOS laptop. ## What it installs ### Core tools | Tool | Purpose | Source | |------|---------|--------| | **pi** | Coding agent (TUI) | `sscoble/pi-mono` (Forgejo mirror of `badlogic/pi-mono`) | | **qmd** | Vault search | `@tobilu/qmd` (npm, wrapped via bunx) | | **git** | Version control | nixpkgs | | **nodejs** | JavaScript runtime | nixpkgs | | **bun** | Fast JS runtime + bundler | nixpkgs | | **zsh** | Shell (+ oh-my-zsh, autosuggestions, syntax highlighting) | nixpkgs | | **neovim** | Editor (minimal Lua config) | nixpkgs | | **python3 + uv** | Python tooling | nixpkgs | | **go** | Go toolchain | nixpkgs | | **docker** | Containers | nixpkgs | | **tailscale** | Mesh VPN | nixpkgs | | **ripgrep, fd, jq, bat, eza, delta** | Modern CLI tools | nixpkgs | ### Desktop (Hyprland) | Tool | Purpose | |------|--------| | **Hyprland** | Tiling Wayland compositor (gaps, blur, animations) | | **waybar** | Status bar with workspaces, clock, CPU, battery, network, audio | | **ghostty** | Fast native Wayland terminal emulator | | **zellij** | Terminal multiplexer (cmux equivalent — tabs, panes, floating) | | **rofi-wayland** | App launcher (SUPER + D) | | **dunst** | Notification daemon | | **swww** | Animated wallpaper | | **hyprlock** | Lock screen (SUPER + L, auto-lock 5min idle) | | **hypridle** | Idle daemon (lock + display sleep) | | **thunar** | File manager (SUPER + N) | | **grim + slurp + swappy** | Screenshots (SUPER + S = area, SUPER + Shift + S = full) | | **cliphist** | Clipboard history (SUPER + V → rofi picker) | | **brightnessctl + pavucontrol** | Brightness and audio control | ### Workspaces | # | Name | Icon | Purpose | |---|------|------|--------| | 1 | shell | 󰆍 | Terminal | | 2 | code | 󰨞 | Development (editors, git) | | 3 | web | 󰖟 | Browser | | 4 | chat | 󰭻 | Communication (Discord, etc.) | | 5 | vault | 󰠮 | Knowledge / vault | | 6 | media | 󰎆 | Media player | | 7-9 | 7-9 | — | Spare | | 10 | sys | 󰒓 | System settings | ## Keybindings | Key | Action | |-----|--------| | `SUPER + Return` | Open terminal with multiplexer (ghostty -e zellij) | | `SUPER + Shift + Return` | Open plain terminal (ghostty) | | `SUPER + D` / `SUPER + Space` | App launcher (rofi) | | `SUPER + B` | Firefox | | `SUPER + N` | File manager (thunar) | | `SUPER + Q` | Close window | | `SUPER + F` | Fullscreen | | `SUPER + G` | Toggle floating window | | `SUPER + L` | Lock screen | | `SUPER + V` | Clipboard history | | `SUPER + 1-0` | Switch to workspace 1-10 | | `SUPER + Shift + 1-0` | Move window to workspace 1-10 | | `SUPER + H/J/K/L` | Move focus (left/down/up/right) | | `SUPER + Shift + H/J/K/L` | Move window | | `SUPER + Ctrl + H/J/K/L` | Resize window | | `SUPER + S` | Screenshot area (→ swappy annotate) | | `SUPER + Shift + S` | Screenshot full screen | | `SUPER + Shift + Q` | Exit Hyprland | | `SUPER + Shift + R` | Reload Hyprland config | ### Zellij (terminal multiplexer) | Key | Action | |-----|--------| | `Ctrl + G` | Enter command mode | | `Ctrl + P` | Split pane down | | `Ctrl + N` | Split pane right | | `Ctrl + T` | New tab | | `Ctrl + H/J/K/L` | Move focus | | `Ctrl + X` | Close pane | | `Ctrl + F` | Toggle floating pane | | `Ctrl + Z` | Zoom pane fullscreen | | `Ctrl + Q` | Close tab | | `Ctrl + D` | Detach session | ## First-time setup (new laptop) ```bash # 1. Install NixOS (minimal ISO) — set up network during install # 2. Rebuild directly from Forgejo (no local clone needed) sudo nixos-rebuild switch --flake git+https://os.scoble.me/forgejo/sscoble/laptop-config.git#laptop # 3. First build of pi will fail — copy npmDepsHash from error, paste into flake.nix # Then re-clone/push the fix, or override locally: # nix build git+https://os.scoble.me/forgejo/sscoble/laptop-config.git#pi-coding-agent # 4. Rebuild again with correct hash sudo nixos-rebuild switch --flake git+https://os.scoble.me/forgejo/sscoble/laptop-config.git#laptop # 5. Restore personal configs from backup: # ~/.pi/agent/SYSTEM.md # ~/.pi/agent/models.json # ~/.pi/agent/mcp.json # ~/.pi/agent/settings.json # ~/.ssh/id_ed25519 # ~/wallpapers/default.jpg ``` ## Updating pi The pi-mono repo is mirrored from upstream and syncs every 24h. ```bash # Force a mirror sync (on n97-mini) ssh n97-mini 'sudo -u forgejo forgejo admin repo sync --config /var/lib/forgejo/custom/conf/app.ini sscoble/pi-mono' ``` ## Repo structure ``` laptop-config/ ├── flake.nix # Two targets: nixosConfigurations.laptop + homeConfigurations.sscoble ├── modules/ │ ├── laptop.nix # System packages, zsh, fonts, SSH │ └── hyprland.nix # Hyprland WM, greetd, PipeWire, portals, bluetooth ├── home/ │ ├── sscoble.nix # Shared (macOS + NixOS): zsh, git, nvim, pi, dirs, SSH │ ├── desktop.nix # Linux-only: Hyprland, waybar, ghostty, zellij, themes │ └── wgu.nix # WGU software: Zotero, Brave, Obsidian, VSCode, Typst, Bitwarden └── README.md ``` ## Two targets, one config ```bash # Personal NixOS laptop (full system + Hyprland desktop) sudo nixos-rebuild switch --flake git+https://os.scoble.me/forgejo/sscoble/laptop-config.git#laptop # Work Mac (home-manager standalone — dotfiles, tools, no desktop) home-manager switch --flake git+https://os.scoble.me/forgejo/sscoble/laptop-config.git#sscoble ``` Same zsh, git, neovim, pi config, SSH config on both machines. ## Related repos | Repo | Purpose | |------|--------| | [sscoble/pi-mono](https://os.scoble.me/forgejo/sscoble/pi-mono) | pi coding agent (mirror of badlogic/pi-mono) | | [sscoble/wgu](https://os.scoble.me/forgejo/sscoble/wgu) | WGU coursework monorepo — class templates, study strategy, OB1 integration | ## Forgejo Actions An action keeps pi up to date — when upstream `badlogic/pi-mono` releases a new tag, the Forgejo mirror picks it up automatically. A scheduled workflow in this repo checks for tag drift daily.