.dotfiles
NixOS + Home Manager configuration for jashton's machines, built as a single flake.
NixOS Flakes Structure
.
├── flake.nix / flake.lock Inputs + the 3 nixosConfigurations (violet, lilac, lavender)
├── hosts/<name>/ Per-machine entrypoint + hardware.nix
├── system/ Shared NixOS (system-level) configuration
├── home/ Home Manager configuration for user "jashton"
├── secrets/ + .sops.yaml sops-nix encrypted secrets
└── ports.registry State file written by the find-open-port script
flake.nix pins nixpkgs to nixos-26.05 (plus an nixpkgs-unstable follower), and pulls in home-manager, sops-nix, niri (compositor), wvkbd-src (on-screen keyboard source), the DankMaterialShell trio (dms, dms-plugin-registry, danksearch), and nixos-hardware. Its outputs define three nixosConfigurations, one per host — each wires up the niri/dms-plugin-registry/sops-nix NixOS modules and a home-manager.users.jashton block importing home/jashton.nix (plus the danksearch home module).
hosts/ — one directory per machine, each with default.nix (hostname + host-specific services/hardware tweaks, imports ../../system) and hardware.nix (generated hardware scan):
violet— imports the ThinkPad-specific security module (system/security/thinkpad.nix), disables lid-switch suspend, has (disabled) TLP power-profile tuning, and enablesinput-remapper.lilac— Framework laptop (Intel Core Ultra series 3, vianixos-hardware), fingerprint reader + Thunderbolt/bolt + Intel graphics acceleration.lavender— minimal host, just graphics enablement.- Both
violet/lilacopen a Thunderbolt-networking point-to-point link (thunderbolt0, ports 4242).
system/ — shared NixOS config imported by every host, split by concern:
packages.nix— system-wide packages, unfree allowed, plus a hand-writtenunixscript (sudo nixos-rebuild switch, then auto-commits/pushes the dotfiles repo on success) and Steam setup.core/—boot.nix(systemd-boot,uinputmodule),audio.nix(PipeWire/Bluetooth tuning),env.nix(zsh + oh-my-zsh, Nerd Font, flakes enabled, shell aliases),locale.nix(Denver/en_US),power.nix(deep sleep).security/—sops.nix(age-via-SSH-host-key secrets),sudo.nix(passwordlesstlpfor jashton),systemd.nix,thinkpad.nix(fprintd),users.nix(user/group defs).network/— NetworkManager + firewall, pluspi-hole.nix(a Pi-hole container run via Podmanoci-containers).services/— currently an empty placeholder module (compositor/greeter services are declared per-host instead, seehosts/violet/default.nix).virtualisation/— Podman (with Docker compat), Waydroid, VirtualBox, libvirtd.
home/ — Home Manager config for jashton:
jashton.nix— top-level user config: session vars, SSH client config (aliases forlavender/violet/lilac/heliotrope), thelan-mouseuser service, workspace directory scaffolding (~/dev,~/school, etc.), acustom_wvkbdpackage override (buildswvkbdfromwvkbd-srcagainst the.custom.hfiles below), and a set of hand-written shell tools installed as packages:jroot/jbuild/jrun/jtest/jclean(Java project tooling — see below),fkill(interactivepkillby name),find-open-port(dev-port registry inports.registry).programs/—default.niximportsalacritty.nix(terminal theme/font),git.nix(identity + ignores),nvim.nix(full Neovim config: LSP, completion, Java/jdtls + DAP debugging — see Keybinds).keymap.custom.h,layout.custom.h,config.custom.h(+.bakbackups) are C source overrides for wvkbd'smobintlon-screen-keyboard layout, spliced into thecustom_wvkbdbuild injashton.nix.desktop/—default.niximportsniri.nix(the niri compositor config, touch-gesture daemon, and on-screen-keyboard launcher — see Keybinds);wvkbd.nixis currently an empty stub.
secrets/secrets.yaml + .sops.yaml — sops-encrypted secrets (currently Vaultwarden client id/secret), decrypted at activation time using each host's SSH host key as the age identity.
Keybinds
Niri (compositor, home/desktop/niri.nix)
Mod is niri's default modifier (Super/Windows key).
| Bind | Action |
|---|---|
Mod+Return |
Spawn Alacritty |
Mod+Space |
Toggle DMS spotlight launcher |
Mod+F |
Fullscreen focused window |
Mod+V |
Toggle floating for focused window |
Mod+X |
Close focused window |
Mod+H / Mod+L |
Focus column left / right |
Mod+J / Mod+K |
Focus window down / up |
Mod+Shift+H / Mod+Shift+L |
Move column left / right |
Mod+Shift+J / Mod+Shift+K |
Move column to workspace down / up |
Mod+U / Mod+N |
Focus workspace up / down |
Mod+Shift+P |
Toggle overview |
Mod+P |
Toggle the on-screen keyboard (signals wvkbd-mobintl) |
Mod+Shift+E |
Quit niri |
Print |
Screenshot (interactive) |
Ctrl+Print |
Screenshot whole screen |
XF86AudioRaiseVolume / XF86AudioLowerVolume |
Volume ±5% |
XF86AudioMute |
Toggle mute |
XF86MonBrightnessUp / XF86MonBrightnessDown |
Brightness ±5 (via dms ipc call brightness) |
Touchscreen gestures (lisgd, launched at niri startup, home/desktop/niri.nix)
| Gesture | Action |
|---|---|
| 3-finger swipe left → right | Focus column left |
| 3-finger swipe right → left | Focus column right |
| 3-finger swipe up → down | Focus workspace up |
| 3-finger swipe down → up | Focus workspace down |
| 4-finger swipe down → up | Toggle DMS spotlight |
| 1-finger swipe down → up, starting from the bottom edge | Toggle the on-screen keyboard |
| 1-finger swipe up → down, starting from the top edge | Maximize window to edges |
On-screen keyboard (custom wvkbd-mobintl build, home/programs/{layout,config,keymap}.custom.h)
- Toggle show/hide:
Mod+Por the bottom-edge swipe gesture above (both sendSIGRTMINtowvkbd-mobintl). - The "⌨" key (
NextLayer) cycles keyboard layers:Full ⇄ Specialin portrait,Landscape ⇄ LandscapeSpecialin landscape. Abc(in theSpeciallayer) returns to the base layer.Cmp(Compose) + a letter opens that letter's accent/diacritic picker (e.g.Cmpthene→ é/è/ê/ë/ē…).- The
qkey doubles as a shortcut into the emoji layer. - Alternate script layouts exist in the layout source (Cyrillic, Arabic, Persian, Greek, Georgian, Hebrew) but are not wired into the active
layers[]cycle — onlyFull/Special(portrait) andLandscape/LandscapeSpecial(landscape) are reachable from the running config.
Neovim (home/programs/nvim.nix, leader = <Space>)
General:
| Bind | Action |
|---|---|
<leader>w |
Write file |
<leader>q |
Quit |
<leader>wq |
Write and quit |
<leader>x |
chmod +x the current file |
Q |
Disabled (no-op) |
o / O |
Open a line below/above, stay in normal mode |
jj (insert mode) |
Escape to normal mode |
Completion (insert mode, nvim-cmp):
| Bind | Action |
|---|---|
<C-Space> |
Trigger completion |
<CR> |
Confirm selection |
<C-n> / <C-p> |
Next / previous item |
Java LSP (buffer-local, active once jdtls attaches to a .java file):
| Bind | Action |
|---|---|
gd |
Go to definition |
gr |
Find references |
K |
Hover docs |
<leader>rn |
Rename symbol |
<leader>ca |
Code action |
<leader>f |
Format buffer |
<leader>oi |
Organize imports |
Debugging (nvim-dap / nvim-dap-ui, global):
| Bind | Action |
|---|---|
<leader>db |
Toggle breakpoint |
<leader>dB |
Conditional breakpoint (prompts for condition) |
<leader>dc |
Continue / start session (prompts for a config if none is running) |
<leader>dn |
Step over |
<leader>di |
Step into |
<leader>du |
Step out |
<leader>dr |
Toggle the debug REPL |
<leader>dq |
Terminate session |
<leader>de (normal + visual) |
Evaluate expression under cursor / selection |
Other applications
- Alacritty (
home/programs/alacritty.nix) — only theme/font/window settings are configured; keybindings are Alacritty's unmodified defaults. - Everything else installed (LibreWolf, Thunderbird, Discord, VLC, Zathura, etc.) is installed via
home.packages/environment.systemPackageswith no keybind customization in this repo — they run with upstream defaults. input-remapperis enabled onviolet(hosts/violet/default.nix) but has no remapping profile committed in this repo.