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 (ghostty) |
SUPER + Shift + Return |
Open terminal + multiplexer (ghostty -e zellij) |
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)
# 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.
# 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 # Overlay, nixosConfig "laptop", devShell
├── modules/
│ ├── laptop.nix # System packages, zsh, fonts, SSH, nix settings
│ └── hyprland.nix # Hyprland WM, greetd, PipeWire, portals, bluetooth
├── home/
│ └── sscoble.nix # home-manager: all desktop config, git, neovim, tools
├── .forgejo/workflows/
│ └── check-pi-version.yml # Daily: opens issue when pi-mono has new tag
└── README.md
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.