A modular NixOS configuration for Dell XPS 15 9550, ThinkPad X390, and MacBook, built without flakes using Npins + Nilla + Hjem.
| Purpose | Tool |
|---|---|
| Dependency pinning | npins |
| Project management | Nilla |
| Home configuration | Hjem + Hjem-Rum |
| VCS | Jujutsu (jj) |
| Editor | Nixvim + Emacs |
| Window manager | Sway (Wayland) |
Per-host hardware configs live in hosts/<name>/hardware-configuration.nix.
The Dell XPS 15 9550 (hosts/xps15_9550/):
- CPU: Intel Core i7-6700HQ
- GPU: Intel HD Graphics 530 + NVIDIA GeForce GTX 960M (PRIME offload)
- Display: 15.6" 4K touchscreen
- RAM: 16 GB DDR4
nixos-config/
├── hosts/
│ ├── macbook/
│ │ └── configuration.nix
│ ├── thinkpad_x390/
│ │ ├── configuration.nix
│ │ └── hardware-configuration.nix
│ └── xps15_9550/
│ ├── configuration.nix
│ └── hardware-configuration.nix
├── modules/
│ ├── nixos/ # System modules
│ │ ├── desktop/ # sway, cosmic, wayfire, xfce
│ │ ├── acestream.nix
│ │ ├── browsers.nix
│ │ ├── creative.nix
│ │ ├── emacs.nix # Emacs + k380-graphite theme
│ │ ├── gaming.nix
│ │ ├── llm-agents.nix
│ │ ├── nix-settings.nix
│ │ ├── productivity.nix
│ │ ├── social.nix
│ │ └── terminal.nix
│ └── home/
│ ├── files/ # Static config files
│ │ ├── k380-graphite-theme.el
│ │ ├── starship.toml
│ │ ├── sway-config
│ │ └── ...
│ ├── hjem/
│ └── nixvim.nix # Nixvim configuration
├── xlibre-build-options/ # XLibre X11 server overrides
│ ├── driver-choice.nix
│ └── my-xlibre-xserver-build-options.nix
├── npins/
│ ├── default.nix # Npins loader
│ └── sources.json # Pinned dependencies
├── nilla.nix # Nilla project root
├── shell.nix # Dev shell (npins, nilla-cli)
└── README.md # This file
- Sway with custom keybindings and status bar (i3status-rust)
- Ly display manager
- US / RU keyboard layouts with Caps Lock switching
- Ghostty — GPU-accelerated terminal with amber/gold theme matching the entire setup
- Tmux — custom theme, Vi keys, integration with Claude / Codex / Opencode
- Zsh — Powerlevel10k, fzf, zoxide, eza, bat
- Nushell — structured shell with git aliases
- Nixvim — Full IDE setup with LSP, Telescope, Neo-tree, Treesitter, custom K380 Graphite colorscheme
- Emacs — Daemon mode, Vertico/Consult/Orderless/Marginalia, Evil mode, Magit, Eglot LSP, K380 Graphite theme
The K380 Graphite theme is shared across the entire stack:
- Nixvim (Lua highlights)
- Emacs (custom theme file)
- Ghostty (palette)
- Tmux (status bar)
Colors: warm dark background #28261F, gold accent #F0C040, sage green #A8D8A0, amber #E8A020.
- NVIDIA PRIME offload (Intel iGPU + NVIDIA dGPU)
- PipeWire audio
- XLibre overlay — custom X11 server build with selected drivers (see
xlibre-build-options/) - Bluetooth, NetworkManager, Power Profiles Daemon
cd ~/nixos-config
nix-shellnpins update # Update all pins
npins update nixpkgs # Update only nixpkgs# Build only
nilla-nixos build
# Build and switch
nilla-nixos switch
# Or directly with nixos-rebuild
sudo nixos-rebuild switch \
--file nilla.nix \
--attr 'systems.nixos."xps15".result'This configuration uses the XLibre overlay to replace the stock NixOS X11 server with a custom-built Xorg. Driver selection and build flags are controlled in xlibre-build-options/:
driver-choice.nix— selects which X11 drivers to include/excludemy-xlibre-xserver-build-options.nix— custom meson build flags
This is loaded via the xlibre-overlay npins input in nilla.nix.
Emacs is installed via pkgs.emacs.pkgs.withPackages with a curated set of packages:
| Package | Purpose |
|---|---|
| vertico | Vertical completion UI |
| orderless | Completion style |
| marginalia | Annotations in minibuffer |
| consult | Search/navigation commands |
| which-key | Keybinding discovery |
| evil + evil-collection | Vim emulation |
| magit | Git interface |
| doom-modeline | Mode line |
| nix-mode | Nix editing |
| treesit-grammars | Treesitter support |
The K380 Graphite theme file lives in modules/home/files/k380-graphite-theme.el and is loaded from ~/.emacs.d/themes/.
Note on
emacs-lucid:emacs-lucidis not available as a top-level nixpkgs attribute. If you prefer the Lucid (Athena) toolkit over GTK, overridepkgs.emacswithwithLucid = true. See comments inmodules/nixos/emacs.nix.
This repo uses jj instead of git for daily work. Git is kept colocated (.git/ + .jj/) so that Nilla's builtins.fetchGit still works.
# Commit (in jj it's just describe — files auto-track)
jj describe -m "message"
# Push to GitHub
jj git push --bookmark main --remote origin
# View log
jj logRemote: git@github.com:yoptabyte/nixik.git
MIT — see LICENSE.