My Nix configuration. Enter at your own risk.
0

Configure Feed

Select the types of activity you want to include in your feed.

justfile: Pre-lock flake before home-manager switch

Lix has a long-standing bug where the in-process flake locker, used when
home-manager (and nixos-rebuild) need to update the lock mid-switch,
refuses to fetch `path:.` for the root flake — "cannot fetch input
'path:.' because it uses a relative path". This bites whenever a
freshly-added input forces a lock update during the switch.

`nix flake lock` invoked directly canonicalises the root path
differently and works fine. Add a `_relock` recipe that runs it, and
make `install`, `install-home`, and `revert` depend on it so the
lock is reconciled before the switch ever touches it. `update` already
runs `nix flake update` so it's unaffected.

author
Isaac Corbrey
date (Jun 5, 2026, 2:55 PM -0400) commit 37ec2c60 parent 4b6957e6 change-id rtxxrunw
+286 -3
+275
flake.lock
··· 1 1 { 2 2 "nodes": { 3 + "actor-typeahead-src": { 4 + "flake": false, 5 + "locked": { 6 + "lastModified": 1762835797, 7 + "narHash": "sha256-heizoWUKDdar6ymfZTnj3ytcEv/L4d4fzSmtr0HlXsQ=", 8 + "ref": "refs/heads/main", 9 + "rev": "677fe7f743050a4e7f09d4a6f87bbf1325a06f6b", 10 + "revCount": 6, 11 + "type": "git", 12 + "url": "https://tangled.org/@jakelazaroff.com/actor-typeahead" 13 + }, 14 + "original": { 15 + "type": "git", 16 + "url": "https://tangled.org/@jakelazaroff.com/actor-typeahead" 17 + } 18 + }, 3 19 "auto-cpufreq": { 4 20 "inputs": { 5 21 "nixpkgs": [ ··· 142 158 "type": "github" 143 159 } 144 160 }, 161 + "fenix": { 162 + "inputs": { 163 + "nixpkgs": [ 164 + "tangled", 165 + "nixpkgs" 166 + ], 167 + "rust-analyzer-src": "rust-analyzer-src" 168 + }, 169 + "locked": { 170 + "lastModified": 1780397302, 171 + "narHash": "sha256-SQmrkj17xBdvc8lVMbsY7pIJCjKftgNh42R1keP3dLQ=", 172 + "owner": "nix-community", 173 + "repo": "fenix", 174 + "rev": "f6670530f53e69cc284f7aef818eb0f08fe81905", 175 + "type": "github" 176 + }, 177 + "original": { 178 + "owner": "nix-community", 179 + "repo": "fenix", 180 + "type": "github" 181 + } 182 + }, 183 + "flake-compat": { 184 + "flake": false, 185 + "locked": { 186 + "lastModified": 1751685974, 187 + "narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=", 188 + "rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1", 189 + "type": "tarball", 190 + "url": "https://git.lix.systems/api/v1/repos/lix-project/flake-compat/archive/549f2762aebeff29a2e5ece7a7dc0f955281a1d1.tar.gz?rev=549f2762aebeff29a2e5ece7a7dc0f955281a1d1" 191 + }, 192 + "original": { 193 + "type": "tarball", 194 + "url": "https://git.lix.systems/lix-project/flake-compat/archive/main.tar.gz" 195 + } 196 + }, 145 197 "flake-parts": { 146 198 "inputs": { 147 199 "nixpkgs-lib": [ ··· 202 254 "type": "github" 203 255 } 204 256 }, 257 + "flake-utils_2": { 258 + "inputs": { 259 + "systems": "systems_3" 260 + }, 261 + "locked": { 262 + "lastModified": 1731533236, 263 + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 264 + "owner": "numtide", 265 + "repo": "flake-utils", 266 + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 267 + "type": "github" 268 + }, 269 + "original": { 270 + "owner": "numtide", 271 + "repo": "flake-utils", 272 + "type": "github" 273 + } 274 + }, 205 275 "gojo": { 206 276 "inputs": { 207 277 "nixpkgs": [ ··· 222 292 "type": "github" 223 293 } 224 294 }, 295 + "gomod2nix": { 296 + "inputs": { 297 + "flake-utils": "flake-utils_2", 298 + "nixpkgs": [ 299 + "tangled", 300 + "nixpkgs" 301 + ] 302 + }, 303 + "locked": { 304 + "lastModified": 1763982521, 305 + "narHash": "sha256-ur4QIAHwgFc0vXiaxn5No/FuZicxBr2p0gmT54xZkUQ=", 306 + "owner": "nix-community", 307 + "repo": "gomod2nix", 308 + "rev": "02e63a239d6eabd595db56852535992c898eba72", 309 + "type": "github" 310 + }, 311 + "original": { 312 + "owner": "nix-community", 313 + "repo": "gomod2nix", 314 + "type": "github" 315 + } 316 + }, 225 317 "helix": { 226 318 "inputs": { 227 319 "nixpkgs": [ ··· 264 356 "type": "github" 265 357 } 266 358 }, 359 + "htmx-src": { 360 + "flake": false, 361 + "locked": { 362 + "narHash": "sha256-nm6avZuEBg67SSyyZUhjpXVNstHHgUxrtBHqJgowU08=", 363 + "type": "file", 364 + "url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js" 365 + }, 366 + "original": { 367 + "type": "file", 368 + "url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js" 369 + } 370 + }, 371 + "htmx-ws-src": { 372 + "flake": false, 373 + "locked": { 374 + "narHash": "sha256-2fg6KyEJoO24q0fQqbz9RMaYNPQrMwpZh29tkSqdqGY=", 375 + "type": "file", 376 + "url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2" 377 + }, 378 + "original": { 379 + "type": "file", 380 + "url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2" 381 + } 382 + }, 383 + "ibm-plex-mono-src": { 384 + "flake": false, 385 + "locked": { 386 + "lastModified": 1731402378, 387 + "narHash": "sha256-OwUmrPfEehLDz0fl2ChYLK8FQM2p0G1+EMrGsYEq+6g=", 388 + "type": "tarball", 389 + "url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip" 390 + }, 391 + "original": { 392 + "type": "tarball", 393 + "url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip" 394 + } 395 + }, 396 + "indigo": { 397 + "flake": false, 398 + "locked": { 399 + "lastModified": 1753693716, 400 + "narHash": "sha256-DMIKnCJRODQXEHUxA+7mLzRALmnZhkkbHlFT2rCQYrE=", 401 + "owner": "oppiliappan", 402 + "repo": "indigo", 403 + "rev": "5f170569da9360f57add450a278d73538092d8ca", 404 + "type": "github" 405 + }, 406 + "original": { 407 + "owner": "oppiliappan", 408 + "repo": "indigo", 409 + "type": "github" 410 + } 411 + }, 412 + "inter-fonts-src": { 413 + "flake": false, 414 + "locked": { 415 + "lastModified": 1731687360, 416 + "narHash": "sha256-5vdKKvHAeZi6igrfpbOdhZlDX2/5+UvzlnCQV6DdqoQ=", 417 + "type": "tarball", 418 + "url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip" 419 + }, 420 + "original": { 421 + "type": "tarball", 422 + "url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip" 423 + } 424 + }, 267 425 "llm-agents": { 268 426 "inputs": { 269 427 "blueprint": "blueprint", ··· 289 447 "type": "github" 290 448 } 291 449 }, 450 + "lucide-src": { 451 + "flake": false, 452 + "locked": { 453 + "lastModified": 1754044466, 454 + "narHash": "sha256-+exBR2OToB1iv7ZQI2S4B0lXA/QRvC9n6U99UxGpJGs=", 455 + "type": "tarball", 456 + "url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip" 457 + }, 458 + "original": { 459 + "type": "tarball", 460 + "url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip" 461 + } 462 + }, 463 + "mermaid-src": { 464 + "flake": false, 465 + "locked": { 466 + "narHash": "sha256-/YOdECG2V5c3kJ1QfGvhziTT6K/Dx/4mOk2mr3Fs/do=", 467 + "type": "file", 468 + "url": "https://cdn.jsdelivr.net/npm/mermaid@11.12.3/dist/mermaid.min.js" 469 + }, 470 + "original": { 471 + "type": "file", 472 + "url": "https://cdn.jsdelivr.net/npm/mermaid@11.12.3/dist/mermaid.min.js" 473 + } 474 + }, 292 475 "nixpkgs": { 293 476 "locked": { 294 477 "lastModified": 1777954456, ··· 312 495 "owner": "nixos", 313 496 "repo": "nixpkgs", 314 497 "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", 498 + "type": "github" 499 + }, 500 + "original": { 501 + "owner": "nixos", 502 + "ref": "nixos-unstable", 503 + "repo": "nixpkgs", 504 + "type": "github" 505 + } 506 + }, 507 + "nixpkgs_3": { 508 + "locked": { 509 + "lastModified": 1771848320, 510 + "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", 511 + "owner": "nixos", 512 + "repo": "nixpkgs", 513 + "rev": "2fc6539b481e1d2569f25f8799236694180c0993", 315 514 "type": "github" 316 515 }, 317 516 "original": { ··· 374 573 "llm-agents": "llm-agents", 375 574 "nixpkgs": "nixpkgs", 376 575 "nur": "nur", 576 + "tangled": "tangled", 377 577 "zen-browser": "zen-browser" 378 578 } 379 579 }, 580 + "rust-analyzer-src": { 581 + "flake": false, 582 + "locked": { 583 + "lastModified": 1780337665, 584 + "narHash": "sha256-RS3F+/6dtBIwd5+47GVen3jAk62/KumFZ4q3RVYafDk=", 585 + "owner": "rust-lang", 586 + "repo": "rust-analyzer", 587 + "rev": "55af1774e9e840d3b28d12fcfaa72d2e2caa8ac9", 588 + "type": "github" 589 + }, 590 + "original": { 591 + "owner": "rust-lang", 592 + "ref": "nightly", 593 + "repo": "rust-analyzer", 594 + "type": "github" 595 + } 596 + }, 380 597 "rust-overlay": { 381 598 "inputs": { 382 599 "nixpkgs": [ ··· 398 615 "type": "github" 399 616 } 400 617 }, 618 + "sqlite-lib-src": { 619 + "flake": false, 620 + "locked": { 621 + "lastModified": 1706631843, 622 + "narHash": "sha256-bJoMjirsBjm2Qk9KPiy3yV3+8b/POlYe76/FQbciHro=", 623 + "type": "tarball", 624 + "url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip" 625 + }, 626 + "original": { 627 + "type": "tarball", 628 + "url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip" 629 + } 630 + }, 401 631 "systems": { 402 632 "locked": { 403 633 "lastModified": 1681028828, ··· 426 656 "owner": "nix-systems", 427 657 "repo": "default", 428 658 "type": "github" 659 + } 660 + }, 661 + "systems_3": { 662 + "locked": { 663 + "lastModified": 1681028828, 664 + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 665 + "owner": "nix-systems", 666 + "repo": "default", 667 + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 668 + "type": "github" 669 + }, 670 + "original": { 671 + "owner": "nix-systems", 672 + "repo": "default", 673 + "type": "github" 674 + } 675 + }, 676 + "tangled": { 677 + "inputs": { 678 + "actor-typeahead-src": "actor-typeahead-src", 679 + "fenix": "fenix", 680 + "flake-compat": "flake-compat", 681 + "gomod2nix": "gomod2nix", 682 + "htmx-src": "htmx-src", 683 + "htmx-ws-src": "htmx-ws-src", 684 + "ibm-plex-mono-src": "ibm-plex-mono-src", 685 + "indigo": "indigo", 686 + "inter-fonts-src": "inter-fonts-src", 687 + "lucide-src": "lucide-src", 688 + "mermaid-src": "mermaid-src", 689 + "nixpkgs": "nixpkgs_3", 690 + "sqlite-lib-src": "sqlite-lib-src" 691 + }, 692 + "locked": { 693 + "lastModified": 1780425595, 694 + "narHash": "sha256-iqGE8cR8VwA11+6GgaklFxJCgq7sL8kJIOwyqhZgCTs=", 695 + "ref": "refs/heads/master", 696 + "rev": "9f6b95dcbec8d2699fd437dd8e7ae6ae2e4a53ba", 697 + "revCount": 2588, 698 + "type": "git", 699 + "url": "https://tangled.org/tangled.org/core" 700 + }, 701 + "original": { 702 + "type": "git", 703 + "url": "https://tangled.org/tangled.org/core" 429 704 } 430 705 }, 431 706 "treefmt-nix": {
+11 -3
justfile
··· 5 5 # - Will fail if the hostname does not have a valid configuration. 6 6 # 7 7 # Snapshot and install the current configuration. 8 - install user=shell('whoami') hostname=shell('hostname'): _snapshot (_switch user hostname) 8 + install user=shell('whoami') hostname=shell('hostname'): _relock _snapshot (_switch user hostname) 9 9 10 10 # Install only the Home Manager configuration. 11 - install-home user=shell('whoami') hostname=shell('hostname'): _snapshot (_switch-home user hostname) 11 + install-home user=shell('whoami') hostname=shell('hostname'): _relock _snapshot (_switch-home user hostname) 12 12 13 13 # Read the news. 14 14 news user=shell('whoami') hostname=shell('hostname'): ··· 18 18 update user=shell('whoami') hostname=shell('hostname'): _update _snapshot (_switch user hostname) 19 19 20 20 # Abandon current changes and install the previous configuration. 21 - revert user=shell('whoami') hostname=shell('hostname'): _abandon (_switch user hostname) 21 + revert user=shell('whoami') hostname=shell('hostname'): _abandon _relock (_switch user hostname) 22 22 23 23 _switch user hostname: (_switch-nixos hostname) (_switch-home user hostname) 24 24 ··· 42 42 _update: 43 43 @./scripts/run-quiet "Updating flake inputs..." -- nix flake update 44 44 @gum log --level info "Updated flake inputs" 45 + 46 + # Locks any newly-added inputs and prunes removed ones without refetching 47 + # the already-locked ones. Sidesteps the Lix bug where home-manager's 48 + # in-process locker refuses to fetch `path:.` for the root flake when it 49 + # has to lock a freshly-added input mid-switch. 50 + _relock: 51 + @./scripts/run-quiet "Relocking flake inputs..." -- nix flake lock 52 + @gum log --level info "Relocked flake inputs" 45 53 46 54 # Snapshot the repo in its current state. 47 55 _snapshot: