- modules/t490.nix: TLP power management, CPU throttling (throttled), S3 sleep, remote Nix builders (cluster), fwupd, fprintd, fprintd, Syncthing, Tailscale, Intel VA-API, TrackPoint sensitivity, PipeWire defaults - flake.nix: add nixos-hardware input, import T490 module + nixos-hardware - docs/T490-HARDWARE.md: WiFi variants, graphics, audio, fingerprint, sleep guide - docs/T490-BATTERY.md: TLP config, threshold strategy, real-world battery numbers - docs/T490-OFFLOADING.md: local vs cluster split, remote builder setup - MIGRATION.md: add T490 post-install steps (fwupd, fprint, remote build key) - README.md: reflect new module and docs structure
170 lines
6.6 KiB
Markdown
170 lines
6.6 KiB
Markdown
# 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
|
|
│ ├── t490.nix # T490 hardware: TLP, throttled, S3 sleep, remote builders, fwupd
|
|
│ └── vm.nix # UTM aarch64 VM for testing
|
|
├── home/
|
|
│ ├── sscoble.nix # Shared (macOS + NixOS): zsh, git, nvim, pi, direnv, SSH
|
|
│ ├── desktop.nix # Linux-only: Hyprland, waybar, ghostty, zellij, themes
|
|
│ └── wgu.nix # WGU software: Zotero, Brave, Obsidian, VSCode, Typst, Bitwarden
|
|
├── docs/
|
|
│ ├── T490-HARDWARE.md # WiFi, GPU, audio, fingerprint, sleep/resume guide
|
|
│ ├── T490-BATTERY.md # TLP config, threshold strategy, real-world numbers
|
|
│ └── T490-OFFLOADING.md # What runs local vs cluster, remote builder setup
|
|
└── 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 |
|
|
| [NixOS/nixos-hardware](https://github.com/NixOS/nixos-hardware) | T490 hardware quirks module (imported via flake input) |
|
|
|
|
## 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.
|