mirror of
https://github.com/Cian-H/My_NixOS_Config.git
synced 2026-05-08 22:21:42 +01:00
Compare commits
128 Commits
c24b894ccc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 7995a87f71 | |||
| 4678cadd72 | |||
| b2645b5996 | |||
| 894a5c9828 | |||
| 576e5cfffa | |||
| 2d44cda4de | |||
| 647cb5c098 | |||
| 3906a51581 | |||
| 69a1f4364b | |||
| 36c0541d61 | |||
| 1a5c582aca | |||
| 58950a3a81 | |||
| 4d5a66d21b | |||
| 96abb9ca7a | |||
| ac37790efd | |||
| 8bc8cfeb7c | |||
| cf2c5a4269 | |||
| d7dfb807a6 | |||
| acbe360b55 | |||
| 0f9cdba39f | |||
| 85a598dd06 | |||
| 6dd23701d7 | |||
| 4b1cfdd845 | |||
| 7cd07d90f2 | |||
| 077f266b51 | |||
| c264f0867f | |||
| e08fe8a195 | |||
| c1200dcf1e | |||
| cc9e3c1927 | |||
| bc5be7c553 | |||
| b4cc636160 | |||
| 9332df2a8d | |||
| cf76e1f8c2 | |||
| da05b15ff0 | |||
| e24b3e722e | |||
| cbcfd5c482 | |||
| 75705ebced | |||
| 2ce738fc0e | |||
| c4d74f74b8 | |||
| ea35fe339b | |||
| 3cf2747833 | |||
| 1b5084c36c | |||
| 62622d8484 | |||
| af45dc34cf | |||
| 3d2516aa83 | |||
| 5d15ebe2d2 | |||
| e8becbb9b4 | |||
| 25e607b05f | |||
| 11dbca9a25 | |||
| 705861861c | |||
| af9e6c1f99 | |||
| 60c8c0e805 | |||
| 052957dda2 | |||
| a99d56674a | |||
| 0ee99ecacc | |||
| 5961834ac1 | |||
| 43890000f1 | |||
| c9dd770fe7 | |||
| d25930beda | |||
| 2e1da650f1 | |||
| 1bed7f9a24 | |||
| 0bdb2cd9c7 | |||
| a2ccb82883 | |||
| 313788b705 | |||
| 10f251232f | |||
| da96083321 | |||
| 1e7dc1c592 | |||
| 973d334944 | |||
| 22bc6e1411 | |||
| 4a57caf66f | |||
| f9ff10b687 | |||
| bfb58ab2d1 | |||
| 845f148529 | |||
| dbe307daa8 | |||
| a6f9f11759 | |||
| 60c06f47f6 | |||
| 71ef3cd92e | |||
| 15a6a14b7e | |||
| 1c5319f82f | |||
| 0d644d769c | |||
| 1d8ce0dd02 | |||
| 0303c204e4 | |||
| 6bbff50ba0 | |||
| 82ef0d74d6 | |||
| 74a6017de2 | |||
| 0016ae4a8a | |||
| 4e68cd734b | |||
| dadbcbb9ea | |||
| 9670b914e2 | |||
| 4f11e3f493 | |||
| 8296de917d | |||
| a81bce828a | |||
| 7cb86d6f50 | |||
| a62f8fdcf4 | |||
| 4375c0629b | |||
| 4286f74af8 | |||
| ddd249b6df | |||
| 94e38cbe84 | |||
| c2ec4c2e8a | |||
| 954652802d | |||
| 3cbadd49ef | |||
| 7add6b42cb | |||
| fc6dc5fcc4 | |||
| 0d151652da | |||
| 6c74c6aac0 | |||
| f610ea778d | |||
| a2306cccd4 | |||
| 717a6ee2f4 | |||
| 7c8d91d0bf | |||
| 7074d8f426 | |||
| 0c22cb09ff | |||
| 8126c81e97 | |||
| 4b56d75dd6 | |||
| 375e0882fe | |||
| 5db7b3c3ea | |||
| 9fdf746aff | |||
| 92e51c4ec0 | |||
| 4b6c081bdd | |||
| 0c7a0e0414 | |||
| c3ba099953 | |||
| 94f550cc9d | |||
| 1c71c860c6 | |||
| 6f8e075aac | |||
| 59b814dcbd | |||
| 0a994a3013 | |||
| 8ecc67c56e | |||
| dfa280fffd | |||
| 338337b880 |
@@ -1 +1,2 @@
|
|||||||
nix.conf
|
nix.conf
|
||||||
|
.direnv
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
# **My NixOS Configuration ❄️**
|
||||||
|
|
||||||
|
This repository contains my personal declarative configuration for NixOS systems and Home Manager profiles. It uses **Nix Flakes** for reproducibility and dependency management.
|
||||||
|
|
||||||
|
## **🖥️ Hosts**
|
||||||
|
|
||||||
|
| Hostname | Type | Description | Key Features |
|
||||||
|
| :---- | :---- | :---- | :---- |
|
||||||
|
| **worklaptop** | Laptop | Personal workstation | Hyprland (UWSM), Nvidia Prime, Dev Tools, Gaming |
|
||||||
|
| **homeserver** | Server | Headless Homelab | Podman Containers, Caddy Reverse Proxy, Gitea, Nextcloud |
|
||||||
|
| **core** | Profile | Generic Home Manager config | Base CLI tools, Shell config, Dotfiles (Distro-agnostic) |
|
||||||
|
|
||||||
|
## **✨ Features**
|
||||||
|
|
||||||
|
* **Flakes:** Fully flake-enabled configuration.
|
||||||
|
* **Shell:** [Nushell](https://www.nushell.sh/) configured as the default user shell with carapace and starship integration.
|
||||||
|
* **Core Profile:** A core configuration is available for bootstrapping new machines or for use on non-NixOS Linux distributions, providing a consistent shell and CLI environment without system-level dependencies.
|
||||||
|
* **Window Manager:** Hyprland with uwsm (Universal Wayland Session Manager) on the laptop.
|
||||||
|
* **Secrets:** [Sops-nix](https://github.com/Mic92/sops-nix) implementation using Age encryption for managing sensitive data (API keys, database passwords).
|
||||||
|
* **Containers:** Declarative OCI containers using Podman (replacing Docker) for homeserver services.
|
||||||
|
* **Automation:** A justfile is included to simplify system updates and garbage collection.
|
||||||
|
* **Theming:** Centralized TokyoNight theme definition passed as specialArgs to Home Manager modules.
|
||||||
|
* **Dotfiles:** Dotfiles are managed via a git submodule mapped to home-manager/core/dotfiles.
|
||||||
|
|
||||||
|
## **📂 Structure**
|
||||||
|
|
||||||
|
.
|
||||||
|
├── .github/ \# GitHub Actions (Submodule sync)
|
||||||
|
├── flake.nix \# Entrypoint & Input definitions
|
||||||
|
├── flake.lock \# Pinned dependency versions
|
||||||
|
├── justfile \# Command runner for system maintenance
|
||||||
|
├── nixos/ \# System-level configurations
|
||||||
|
│ ├── core/ \# Shared system modules
|
||||||
|
│ ├── homeserver/ \# Server-specific hardware & services
|
||||||
|
│ └── worklaptop/ \# Laptop-specific hardware & services
|
||||||
|
├── home-manager/ \# User-level configurations
|
||||||
|
│ ├── core/ \# Shared user modules (dotfiles, shell, etc.)
|
||||||
|
│ ├── homeserver/ \# Server user config
|
||||||
|
│ └── worklaptop/ \# Laptop user config (Hyprland, Theming)
|
||||||
|
└── secrets.yaml \# Encrypted secrets (SOPS)
|
||||||
|
|
||||||
|
## **🚀 Bootstrap / Installation**
|
||||||
|
|
||||||
|
1. **Clone the repository:**
|
||||||
|
git clone \--recursive \[https://github.com/Cian-H/my\_nixos\_config.git\](https://github.com/Cian-H/my\_nixos\_config.git) /home/cianh/my\_nixos\_config
|
||||||
|
cd my\_nixos\_config
|
||||||
|
|
||||||
|
2. **Setup Secrets:**
|
||||||
|
Place your Age private key in the appropriate location (defined in home-manager/\<host\>.nix):
|
||||||
|
* Target: \~/.config/sops/age/keys.txt
|
||||||
|
3. **Apply Configuration:**
|
||||||
|
* **NixOS System:**
|
||||||
|
sudo nixos-rebuild switch \--flake .\#\<hostname\>
|
||||||
|
|
||||||
|
* **Home Manager (Specific Host):**
|
||||||
|
home-manager switch \--flake .\#cianh@\<hostname\>
|
||||||
|
|
||||||
|
* **Home Manager (Core/Generic):**
|
||||||
|
home-manager switch \--flake .\#cianh@core
|
||||||
|
|
||||||
|
## **🛠️ Management (Justfile)**
|
||||||
|
|
||||||
|
I use just to abstract away common nixos-rebuild and home-manager commands.
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
| :---- | :---- |
|
||||||
|
| just update | Updates both System and Home Manager (pulls git & updates flake). |
|
||||||
|
| just update-root | Updates only the NixOS system configuration. |
|
||||||
|
| just update-home | Updates only the Home Manager configuration. |
|
||||||
|
| just install-home | Installs the generic core Home Manager profile. |
|
||||||
|
| just quick-update | Rebuilds configuration *without* pulling git or updating flake inputs. |
|
||||||
|
| just cleanup \<days\> | Garbage collects generations older than \<days\> and optimizes store. |
|
||||||
|
| just repl | Opens a Nix REPL loaded with the flake context. |
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
\# Full system update
|
||||||
|
just update
|
||||||
|
|
||||||
|
\# Quick rebuild after changing a config file
|
||||||
|
just quick-update
|
||||||
|
|
||||||
|
## **🔒 Secrets Management**
|
||||||
|
|
||||||
|
Secrets are managed via sops-nix.
|
||||||
|
|
||||||
|
* **Config:** .sops.yaml
|
||||||
|
* **Key:** keys.txt (Age key)
|
||||||
|
|
||||||
|
To edit secrets:
|
||||||
|
|
||||||
|
sops home-manager/secrets.yaml
|
||||||
|
|
||||||
|
## **📦 Server Services (Homeserver)**
|
||||||
|
|
||||||
|
The homeserver runs services via Podman, orchestrated in home-manager/homeserver/containers.nix.
|
||||||
|
|
||||||
|
Key services include:
|
||||||
|
|
||||||
|
* **Proxy:** Caddy
|
||||||
|
* **Cloud:** Nextcloud (with Redis & MariaDB)
|
||||||
|
* **Code:** Gitea
|
||||||
|
* **Productivity:** Vikunja
|
||||||
|
* **Media:** Jellyfin
|
||||||
|
|
||||||
|
## **🔗 Submodules**
|
||||||
|
|
||||||
|
This repo uses a submodule for raw dotfiles.
|
||||||
|
|
||||||
|
* **Path:** home-manager/core/dotfiles
|
||||||
|
* **Source:** https://github.com/Cian-H/dotfiles.git
|
||||||
|
|
||||||
|
If the folder is empty, initialize it:
|
||||||
|
|
||||||
|
git submodule update \--init \--recursive
|
||||||
|
|
||||||
Generated
+302
-43
@@ -1,5 +1,40 @@
|
|||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"elephant": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1770910218,
|
||||||
|
"narHash": "sha256-IyHoHbhLFuIgFG+n7dqHwJaXuNnRaEsxCfAsfudV1KY=",
|
||||||
|
"owner": "abenz1267",
|
||||||
|
"repo": "elephant",
|
||||||
|
"rev": "c354a596ec7a7e34e9c26478dc7ef9680bc23e6d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "abenz1267",
|
||||||
|
"repo": "elephant",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1767039857,
|
||||||
|
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"home-manager": {
|
"home-manager": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -7,11 +42,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765384171,
|
"lastModified": 1777851538,
|
||||||
"narHash": "sha256-FuFtkJrW1Z7u+3lhzPRau69E0CNjADku1mLQQflUORo=",
|
"narHash": "sha256-Gp8qwTEYNoy2yvmErVGlvLOQvrtEECCAKbonW7VJef8=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "44777152652bc9eacf8876976fa72cc77ca8b9d8",
|
"rev": "cc09c0f9b7eaa95c2d9827338a5eb03d32505ca5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -24,16 +59,17 @@
|
|||||||
"home-manager_2": {
|
"home-manager_2": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
|
"nixers-repo",
|
||||||
"zen-browser",
|
"zen-browser",
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1762964643,
|
"lastModified": 1771756436,
|
||||||
"narHash": "sha256-RYHN8O/Aja59XDji6WSJZPkJpYVUfpSkyH+PEupBJqM=",
|
"narHash": "sha256-Tl2I0YXdhSTufGqAaD1ySh8x+cvVsEI1mJyJg12lxhI=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "827f2a23373a774a8805f84ca5344654c31f354b",
|
"rev": "5bd3589390b431a63072868a90c0f24771ff4cbb",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -44,7 +80,7 @@
|
|||||||
},
|
},
|
||||||
"hyprcursor-phinger": {
|
"hyprcursor-phinger": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1763845612,
|
"lastModified": 1763845612,
|
||||||
@@ -60,7 +96,79 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixers-repo": {
|
||||||
|
"inputs": {
|
||||||
|
"elephant": "elephant",
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"hyprcursor-phinger": "hyprcursor-phinger",
|
||||||
|
"nixpkgs": "nixpkgs_3",
|
||||||
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
|
"walker": "walker",
|
||||||
|
"zen-browser": "zen-browser"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772125727,
|
||||||
|
"narHash": "sha256-J41Xm8ewrCn16r0bDtOX+qu+uhNiOp9EAvy4FJ6mhKY=",
|
||||||
|
"owner": "Cian-H",
|
||||||
|
"repo": "Nixers",
|
||||||
|
"rev": "918d6b2bf5fbe032fda2bf989e0716de4d68e057",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Cian-H",
|
||||||
|
"repo": "Nixers",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1764242076,
|
||||||
|
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-unstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1771369470,
|
||||||
|
"narHash": "sha256-0NBlEBKkN3lufyvFegY4TYv5mCNHbi5OmBDrzihbBMQ=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "0182a361324364ae3f436a63005877674cf45efb",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-unstable_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1777954456,
|
||||||
|
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1762977756,
|
"lastModified": 1762977756,
|
||||||
"narHash": "sha256-4PqRErxfe+2toFJFgcRKZ0UI9NSIOJa+7RXVtBhy4KE=",
|
"narHash": "sha256-4PqRErxfe+2toFJFgcRKZ0UI9NSIOJa+7RXVtBhy4KE=",
|
||||||
@@ -76,29 +184,13 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-unstable": {
|
"nixpkgs_3": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765186076,
|
"lastModified": 1771714954,
|
||||||
"narHash": "sha256-hM20uyap1a0M9d344I692r+ik4gTMyj60cQWO+hAYP8=",
|
"narHash": "sha256-nhZJPnBavtu40/L2aqpljrfUNb2rxmWTmSjK2c9UKds=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "addf7cf5f383a3101ecfba091b98d0a1263dc9b8",
|
"rev": "afbbf774e2087c3d734266c22f96fca2e78d3620",
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nixos",
|
|
||||||
"ref": "nixos-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1765311797,
|
|
||||||
"narHash": "sha256-mSD5Ob7a+T2RNjvPvOA1dkJHGVrNVl8ZOrAwBjKBDQo=",
|
|
||||||
"owner": "nixos",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "09eb77e94fa25202af8f3e81ddc7353d9970ac1b",
|
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -108,13 +200,45 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_3": {
|
"nixpkgs_4": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764947035,
|
"lastModified": 1768564909,
|
||||||
"narHash": "sha256-EYHSjVM4Ox4lvCXUMiKKs2vETUSL5mx+J2FfutM7T9w=",
|
"narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "a672be65651c80d3f592a89b3945466584a22069",
|
"rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_5": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1777673416,
|
||||||
|
"narHash": "sha256-5c2POKPOjU40Kh0MirOdScBLG0bu9TAuPYAtPRNZMBs=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "26ef669cffa904b6f6832ab57b77892a37c1a671",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-25.11",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_6": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1775888245,
|
||||||
|
"narHash": "sha256-nwASzrRDD1JBEu/o8ekKYEXm/oJW6EMCzCRdrwcLe90=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "13043924aaa7375ce482ebe2494338e058282925",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -124,26 +248,70 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"noctalia": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"noctalia-qs": "noctalia-qs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1777859147,
|
||||||
|
"narHash": "sha256-0vCgxdwrxBkHmqNgJtUMGCFwSV5a6AgYdKAgBCtFFPM=",
|
||||||
|
"owner": "noctalia-dev",
|
||||||
|
"repo": "noctalia-shell",
|
||||||
|
"rev": "6b48834dd6c3913d211476ab2f964f3fb100675e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "noctalia-dev",
|
||||||
|
"repo": "noctalia-shell",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"noctalia-qs": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"noctalia",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"systems": "systems_3",
|
||||||
|
"treefmt-nix": "treefmt-nix"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1777773024,
|
||||||
|
"narHash": "sha256-pLU+KB84A0Jei/vTD6pOS4Ovkmq3QDfPQHg1MlKsRqM=",
|
||||||
|
"owner": "noctalia-dev",
|
||||||
|
"repo": "noctalia-qs",
|
||||||
|
"rev": "d3e26ccd9eecde9139be00caf5dc2d4260fb31ee",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "noctalia-dev",
|
||||||
|
"repo": "noctalia-qs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"hyprcursor-phinger": "hyprcursor-phinger",
|
"nixers-repo": "nixers-repo",
|
||||||
"nixpkgs": "nixpkgs_2",
|
"nixpkgs": "nixpkgs_5",
|
||||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
"nixpkgs-unstable": "nixpkgs-unstable_2",
|
||||||
"sops-nix": "sops-nix",
|
"noctalia": "noctalia",
|
||||||
"zen-browser": "zen-browser"
|
"sops-nix": "sops-nix"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sops-nix": {
|
"sops-nix": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs_3"
|
"nixpkgs": "nixpkgs_6"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765553226,
|
"lastModified": 1777944972,
|
||||||
"narHash": "sha256-Ii16Nq5jL2wURXpV3D3tOM3vPpbKh18roHLkyZCHK4Q=",
|
"narHash": "sha256-VfGRo1qTBKOe3s2gOv8LSoA6Fk19PvBlwQ1ECN0Evn8=",
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"repo": "sops-nix",
|
"repo": "sops-nix",
|
||||||
"rev": "496a6f625f63b780ce849891868f2fad22fd49c6",
|
"rev": "c591bf665727040c6cc5cb409079acb22dcce33c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -152,19 +320,110 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689347949,
|
||||||
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689347949,
|
||||||
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689347949,
|
||||||
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"treefmt-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"noctalia",
|
||||||
|
"noctalia-qs",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1775636079,
|
||||||
|
"narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"walker": {
|
||||||
|
"inputs": {
|
||||||
|
"elephant": [
|
||||||
|
"nixers-repo",
|
||||||
|
"elephant"
|
||||||
|
],
|
||||||
|
"nixpkgs": "nixpkgs_4",
|
||||||
|
"systems": "systems_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1771062828,
|
||||||
|
"narHash": "sha256-y1jBFFO0u+V21y3YldHZozrDwVJVrdC+o3c4M8/rasU=",
|
||||||
|
"owner": "abenz1267",
|
||||||
|
"repo": "walker",
|
||||||
|
"rev": "19b1104585305e0806b842af341630f72038a4b9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "abenz1267",
|
||||||
|
"repo": "walker",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"zen-browser": {
|
"zen-browser": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"home-manager": "home-manager_2",
|
"home-manager": "home-manager_2",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
|
"nixers-repo",
|
||||||
"nixpkgs-unstable"
|
"nixpkgs-unstable"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765578056,
|
"lastModified": 1771876204,
|
||||||
"narHash": "sha256-sE/iRR3LxCWZYOyIxC25Y7O7vUg/uCQZxePWiFr2JY0=",
|
"narHash": "sha256-nTX+Qa3W+xsFxBl+lr4RsWvC4vgZocLt/qDeIvnf4+w=",
|
||||||
"owner": "0xc000022070",
|
"owner": "0xc000022070",
|
||||||
"repo": "zen-browser-flake",
|
"repo": "zen-browser-flake",
|
||||||
"rev": "a2495cfc0e8e0b1d7d6cece49d88b6dbe1ef997d",
|
"rev": "2f951adfab1f5a090fe5ea4c5eaf11efca7f1039",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -1,22 +1,28 @@
|
|||||||
{
|
{
|
||||||
description = "Cian-H's nix config";
|
description = "Cian-H's nix config";
|
||||||
|
|
||||||
|
# Add cachix binary cache to prevent massive compilation times
|
||||||
|
nixConfig = {
|
||||||
|
extra-substituters = ["https://noctalia.cachix.org"];
|
||||||
|
extra-trusted-public-keys = ["noctalia.cachix.org-1:pCOR47nnMEo5thcxNDtzWpOxNFQsBRglJzxWPp3dkU4="];
|
||||||
|
};
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
# Nixpkgs
|
# Nixpkgs
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||||
# Nixpkgs-unstable
|
# Nixpkgs-unstable
|
||||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
# Nixers
|
||||||
|
nixers-repo.url = "github:Cian-H/Nixers";
|
||||||
# Home manager
|
# Home manager
|
||||||
home-manager.url = "github:nix-community/home-manager/release-25.11";
|
home-manager.url = "github:nix-community/home-manager/release-25.11";
|
||||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
# Add sops for secret management
|
# Add sops for secret management
|
||||||
sops-nix.url = "github:Mic92/sops-nix";
|
sops-nix.url = "github:Mic92/sops-nix";
|
||||||
# add phinger hyprcursor flake
|
# Add Noctalia input
|
||||||
hyprcursor-phinger.url = "github:jappie3/hyprcursor-phinger";
|
noctalia = {
|
||||||
# add zen browser flake
|
url = "github:noctalia-dev/noctalia-shell";
|
||||||
zen-browser = {
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
url = "github:0xc000022070/zen-browser-flake";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -24,27 +30,84 @@
|
|||||||
self,
|
self,
|
||||||
nixpkgs,
|
nixpkgs,
|
||||||
nixpkgs-unstable,
|
nixpkgs-unstable,
|
||||||
|
nixers-repo,
|
||||||
home-manager,
|
home-manager,
|
||||||
...
|
...
|
||||||
} @ inputs: let
|
} @ inputs: let
|
||||||
inherit (self) outputs;
|
inherit (self) outputs;
|
||||||
|
worklaptopTheme = {
|
||||||
|
pkgs,
|
||||||
|
unstablePkgs,
|
||||||
|
nixers,
|
||||||
|
}: {
|
||||||
|
gtkTheme = {
|
||||||
|
name = "Tokyonight-Dark";
|
||||||
|
package = pkgs.tokyonight-gtk-theme;
|
||||||
|
};
|
||||||
|
qtTheme = {
|
||||||
|
name = "Kvantum-Tokyo-Night";
|
||||||
|
package = nixers.tokyonight-kvantum-theme;
|
||||||
|
};
|
||||||
|
iconTheme = {
|
||||||
|
name = "Papirus-Dark";
|
||||||
|
package = pkgs.papirus-icon-theme;
|
||||||
|
};
|
||||||
|
cursorTheme = {
|
||||||
|
name = "phinger-cursors-dark";
|
||||||
|
package = pkgs.phinger-cursors;
|
||||||
|
};
|
||||||
|
fonts = {
|
||||||
|
serif = "NotoSerifNerdFont";
|
||||||
|
sansSerif = "NotoSansNerdFont";
|
||||||
|
monospace = "MonaspiceArNerdFontMono";
|
||||||
|
};
|
||||||
|
wallpaperSource = "/home/cianh/Pictures/Wallpapers/City_1_Upscaled.png";
|
||||||
|
wallpaper = "/var/lib/AccountsService/wallpaper/cianh";
|
||||||
|
avatarSource = "/home/cianh/Pictures/face.png";
|
||||||
|
avatar = "/var/lib/AccountsService/icons/cianh";
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
|
# A temporary devshell for running system management functions
|
||||||
|
devShells."x86_64-linux".default = let
|
||||||
|
pkgs = import nixpkgs {system = "x86_64-linux";};
|
||||||
|
in
|
||||||
|
pkgs.mkShell {
|
||||||
|
packages = [
|
||||||
|
pkgs.babashka
|
||||||
|
(pkgs.python3.withPackages (ps: with ps; [typer rich]))
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
# NixOS configuration entrypoint
|
# NixOS configuration entrypoint
|
||||||
# Available through 'nixos-rebuild --flake .#your-hostname'
|
# Available through 'nixos-rebuild --flake .#your-hostname'
|
||||||
nixosConfigurations = {
|
nixosConfigurations = {
|
||||||
worklaptop = nixpkgs.lib.nixosSystem {
|
worklaptop = let
|
||||||
specialArgs = {
|
pkgs = import nixpkgs {
|
||||||
inherit inputs outputs;
|
system = "x86_64-linux";
|
||||||
unstablePkgs = inputs.nixpkgs-unstable.legacyPackages.x86_64-linux;
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
cudaSupport = true;
|
||||||
|
allowUnfreePredicate = _: true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
nixpkgs.lib.nixosSystem {
|
||||||
|
specialArgs = let
|
||||||
|
unstablePkgs = inputs.nixpkgs-unstable.legacyPackages.x86_64-linux;
|
||||||
|
nixers = inputs.nixers-repo.packages.x86_64-linux;
|
||||||
|
in {
|
||||||
|
inherit inputs outputs unstablePkgs nixers;
|
||||||
|
theme = worklaptopTheme {inherit pkgs unstablePkgs nixers;};
|
||||||
|
};
|
||||||
|
modules = [
|
||||||
|
./nixos/worklaptop.nix
|
||||||
|
];
|
||||||
};
|
};
|
||||||
modules = [
|
|
||||||
./nixos/worklaptop.nix
|
|
||||||
];
|
|
||||||
};
|
|
||||||
homeserver = nixpkgs.lib.nixosSystem {
|
homeserver = nixpkgs.lib.nixosSystem {
|
||||||
specialArgs = {
|
specialArgs = {
|
||||||
inherit inputs outputs;
|
inherit inputs outputs;
|
||||||
unstablePkgs = inputs.nixpkgs-unstable.legacyPackages.x86_64-linux;
|
unstablePkgs = inputs.nixpkgs-unstable.legacyPackages.x86_64-linux;
|
||||||
|
nixers = inputs.nixers-repo.packages.x86_64-linux;
|
||||||
};
|
};
|
||||||
modules = [
|
modules = [
|
||||||
./nixos/homeserver.nix
|
./nixos/homeserver.nix
|
||||||
@@ -55,7 +118,7 @@
|
|||||||
# Standalone home-manager configuration entrypoint
|
# Standalone home-manager configuration entrypoint
|
||||||
# Available through 'home-manager --flake .#your-username@your-hostname'
|
# Available through 'home-manager --flake .#your-username@your-hostname'
|
||||||
homeConfigurations = {
|
homeConfigurations = {
|
||||||
"cianh@core" = home-manager.lib.homeManagerConfiguration {
|
"cianh@core" = let
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
# Home-manager requires 'pkgs' instance
|
# Home-manager requires 'pkgs' instance
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
@@ -65,49 +128,58 @@
|
|||||||
allowUnfreePredicate = _: true;
|
allowUnfreePredicate = _: true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
extraSpecialArgs = {
|
in
|
||||||
inherit inputs outputs;
|
home-manager.lib.homeManagerConfiguration {
|
||||||
unstablePkgs = import nixpkgs-unstable {
|
inherit pkgs;
|
||||||
# We also need to do the same for unstable
|
extraSpecialArgs = {
|
||||||
system = "x86_64-linux";
|
inherit inputs outputs;
|
||||||
config = {
|
unstablePkgs = import nixpkgs-unstable {
|
||||||
allowUnfree = true;
|
# We also need to do the same for unstable
|
||||||
allowUnfreePredicate = _: true;
|
system = pkgs.stdenv.hostPlatform.system;
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
allowUnfreePredicate = _: true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
nixers = inputs.nixers-repo.packages.${pkgs.stdenv.hostPlatform.system};
|
||||||
};
|
};
|
||||||
|
modules = [
|
||||||
|
./home-manager/core.nix
|
||||||
|
];
|
||||||
};
|
};
|
||||||
modules = [
|
"cianh@worklaptop" = let
|
||||||
./home-manager/core.nix
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"cianh@worklaptop" = home-manager.lib.homeManagerConfiguration {
|
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
# Home-manager requires 'pkgs' instance
|
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
config = {
|
config = {
|
||||||
allowUnfree = true;
|
allowUnfree = true;
|
||||||
cudaSupport = true;
|
cudaSupport = true;
|
||||||
# Workaround for https://github.com/nix-community/home-manager/issues/2942
|
|
||||||
allowUnfreePredicate = _: true;
|
allowUnfreePredicate = _: true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
extraSpecialArgs = {
|
in
|
||||||
inherit inputs outputs;
|
home-manager.lib.homeManagerConfiguration {
|
||||||
unstablePkgs = import nixpkgs-unstable {
|
inherit pkgs;
|
||||||
# We also need to do the same for unstable
|
|
||||||
system = "x86_64-linux";
|
extraSpecialArgs = let
|
||||||
cudaSupport = true;
|
unstablePkgs = import nixpkgs-unstable {
|
||||||
config = {
|
system = "x86_64-linux";
|
||||||
allowUnfree = true;
|
cudaSupport = true;
|
||||||
allowUnfreePredicate = _: true;
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
allowUnfreePredicate = _: true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
nixers = inputs.nixers-repo.packages.${pkgs.stdenv.hostPlatform.system};
|
||||||
|
in {
|
||||||
|
inherit inputs outputs unstablePkgs nixers;
|
||||||
|
theme = worklaptopTheme {inherit pkgs unstablePkgs nixers;};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
./home-manager/worklaptop.nix
|
||||||
|
];
|
||||||
};
|
};
|
||||||
modules = [
|
"cianh@homeserver" = let
|
||||||
./home-manager/worklaptop.nix
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"cianh@homeserver" = home-manager.lib.homeManagerConfiguration {
|
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
# Home-manager requires 'pkgs' instance
|
# Home-manager requires 'pkgs' instance
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
@@ -117,21 +189,25 @@
|
|||||||
allowUnfreePredicate = _: true;
|
allowUnfreePredicate = _: true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
extraSpecialArgs = {
|
in
|
||||||
inherit inputs outputs;
|
home-manager.lib.homeManagerConfiguration {
|
||||||
unstablePkgs = import nixpkgs-unstable {
|
inherit pkgs;
|
||||||
# We also need to do the same for unstable
|
extraSpecialArgs = {
|
||||||
system = "x86_64-linux";
|
inherit inputs outputs;
|
||||||
config = {
|
unstablePkgs = import nixpkgs-unstable {
|
||||||
allowUnfree = true;
|
# We also need to do the same for unstable
|
||||||
allowUnfreePredicate = _: true;
|
system = "x86_64-linux";
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
allowUnfreePredicate = _: true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
nixers = inputs.nixers-repo.packages.${pkgs.stdenv.hostPlatform.system};
|
||||||
};
|
};
|
||||||
|
modules = [
|
||||||
|
./home-manager/homeserver.nix
|
||||||
|
];
|
||||||
};
|
};
|
||||||
modules = [
|
|
||||||
./home-manager/homeserver.nix
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
./core/packages.nix
|
./core/packages.nix
|
||||||
./core/programs.nix
|
./core/programs.nix
|
||||||
./core/services.nix
|
./core/services.nix
|
||||||
inputs.hyprcursor-phinger.homeManagerModules.hyprcursor-phinger
|
inputs.nixers-repo.homeManagerModules.hyprcursor-phinger
|
||||||
];
|
];
|
||||||
|
|
||||||
nix = {
|
nix = {
|
||||||
|
|||||||
Submodule home-manager/core/dotfiles updated: 0095124356...df5f42306f
+117
-40
@@ -6,63 +6,141 @@
|
|||||||
pkgs,
|
pkgs,
|
||||||
unstablePkgs,
|
unstablePkgs,
|
||||||
...
|
...
|
||||||
}: {
|
}: let
|
||||||
home.file = {
|
noctaliaPlugins = [
|
||||||
".bashrc" = lib.mkIf (!config.programs.bash.enable) {
|
"keybind-cheatsheet"
|
||||||
source = ./dotfiles/dot_bashrc;
|
"privacy-indicator"
|
||||||
};
|
"screen-toolkit"
|
||||||
"nushell" = {
|
];
|
||||||
source = ./dotfiles/dot_config/nushell;
|
|
||||||
target = ".config/nushell";
|
makeNoctaliaEntries = plugin: let
|
||||||
recursive = true;
|
pluginSource = ./dotfiles/dot_config/noctalia/plugins-repo + "/${plugin}";
|
||||||
};
|
in {
|
||||||
"nvim" = {
|
name = "noctalia-plugin-${plugin}";
|
||||||
source = ./dotfiles/dot_config/nvim;
|
value = {
|
||||||
target = ".config/nvim";
|
source = pluginSource;
|
||||||
recursive = true;
|
target = ".config/noctalia/plugins/${plugin}";
|
||||||
};
|
|
||||||
"pypoetry" = {
|
|
||||||
source = ./dotfiles/dot_config/pypoetry;
|
|
||||||
target = ".config/pypoetry";
|
|
||||||
recursive = true;
|
|
||||||
};
|
|
||||||
"Thunar" = {
|
|
||||||
source = ./dotfiles/dot_config/Thunar;
|
|
||||||
target = ".config/Thunar";
|
|
||||||
};
|
|
||||||
"rye" = {
|
|
||||||
source = ./dotfiles/dot_config/.rye;
|
|
||||||
target = ".config/.rye";
|
|
||||||
recursive = true;
|
recursive = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
noctaliaPluginFiles = builtins.listToAttrs (map makeNoctaliaEntries noctaliaPlugins);
|
||||||
|
|
||||||
|
customPluginsDir = ./dotfiles/dot_config/noctalia/plugins-custom;
|
||||||
|
customPlugins = builtins.attrNames (
|
||||||
|
lib.filterAttrs (name: type: type == "directory") (builtins.readDir customPluginsDir)
|
||||||
|
);
|
||||||
|
|
||||||
|
makeCustomEntries = plugin: {
|
||||||
|
name = "noctalia-custom-plugin-${plugin}";
|
||||||
|
value = {
|
||||||
|
source = customPluginsDir + "/${plugin}";
|
||||||
|
target = ".config/noctalia/plugins/${plugin}";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
customPluginFiles = builtins.listToAttrs (map makeCustomEntries customPlugins);
|
||||||
|
in {
|
||||||
|
home.file =
|
||||||
|
{
|
||||||
|
".bashrc".source = ./dotfiles/dot_bashrc;
|
||||||
|
".zshrc".source = ./dotfiles/dot_zshrc;
|
||||||
|
"nushell" = {
|
||||||
|
source = ./dotfiles/dot_config/nushell;
|
||||||
|
target = ".config/nushell/my_config";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
"fish" = {
|
||||||
|
source = ./dotfiles/dot_config/fish;
|
||||||
|
target = ".config/fish";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
"nvim" = {
|
||||||
|
source = lib.cleanSourceWith {
|
||||||
|
src = ./dotfiles/dot_config/nvim;
|
||||||
|
filter = name: type: let
|
||||||
|
baseName = baseNameOf name;
|
||||||
|
in
|
||||||
|
! (
|
||||||
|
(lib.hasPrefix "*/nvim/*" name)
|
||||||
|
|| (lib.hasPrefix "." baseName)
|
||||||
|
|| (lib.hasPrefix "devenv" baseName)
|
||||||
|
|| (lib.hasSuffix ".toml" baseName)
|
||||||
|
|| (lib.hasSuffix ".yml" baseName)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
target = ".config/nvim";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
"noctalia" = {
|
||||||
|
source = lib.cleanSourceWith {
|
||||||
|
src = ./dotfiles/dot_config/noctalia;
|
||||||
|
filter = name: type: let
|
||||||
|
baseName = baseNameOf name;
|
||||||
|
in
|
||||||
|
! (
|
||||||
|
(lib.hasInfix "/plugins/" name)
|
||||||
|
|| (lib.hasInfix "/plugins-repo/" name)
|
||||||
|
|| (lib.hasInfix "/plugins-custom/" name)
|
||||||
|
# || (lib.hasInfix "/plugins-settings/" name)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
target = ".config/noctalia";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
"noctalia-cli" = {
|
||||||
|
source = ./dotfiles/dot_local/bin/executable_noctalia-cli;
|
||||||
|
target = ".local/bin/noctalia-cli";
|
||||||
|
executable = true;
|
||||||
|
};
|
||||||
|
"pypoetry" = {
|
||||||
|
source = ./dotfiles/dot_config/pypoetry;
|
||||||
|
target = ".config/pypoetry";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
"Thunar" = {
|
||||||
|
source = ./dotfiles/dot_config/Thunar;
|
||||||
|
target = ".config/Thunar";
|
||||||
|
};
|
||||||
|
"rye" = {
|
||||||
|
source = ./dotfiles/dot_config/.rye;
|
||||||
|
target = ".config/.rye";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// noctaliaPluginFiles
|
||||||
|
// customPluginFiles;
|
||||||
|
|
||||||
|
# Move across noctalia plugin settings as a writable overlay
|
||||||
|
home.activation.overlayNoctaliaSettings = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||||
|
mkdir -p "$HOME/.config/noctalia/plugins"
|
||||||
|
cp -rL --no-preserve=mode "$HOME/.config/noctalia/plugins-settings/"* "$HOME/.config/noctalia/plugins/"
|
||||||
|
'';
|
||||||
|
|
||||||
xdg.configFile = {
|
xdg.configFile = {
|
||||||
"bat".source = ./dotfiles/dot_config/bat;
|
"bat".source = ./dotfiles/dot_config/bat;
|
||||||
|
"path.env".source = ./dotfiles/dot_config/path.env;
|
||||||
"fastfetch".source = ./dotfiles/dot_config/fastfetch;
|
"fastfetch".source = ./dotfiles/dot_config/fastfetch;
|
||||||
"helix".source = ./dotfiles/dot_config/helix;
|
"helix".source = ./dotfiles/dot_config/helix;
|
||||||
"home-manager".source = ./dotfiles/dot_config/home-manager;
|
"home-manager".source = ./dotfiles/dot_config/home-manager;
|
||||||
"hypr" = {
|
"hypr".source = ./dotfiles/dot_config/hypr;
|
||||||
source = ./dotfiles/dot_config/hypr;
|
|
||||||
recursive = true;
|
|
||||||
# Here, we use OnChange, because we don't want the config to be mutable but we do want it to
|
|
||||||
# manage modifiable state at runtime
|
|
||||||
onChange = ''
|
|
||||||
rm -f ${config.xdg.configHome}/hypr/inputs.conf
|
|
||||||
cp ${config.xdg.configHome}/hypr/HomeManagerInit_inputs.conf ${config.xdg.configHome}/hypr/inputs.conf
|
|
||||||
chmod u+w ${config.xdg.configHome}/hypr/inputs.conf
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"just".source = ./dotfiles/dot_config/just;
|
"just".source = ./dotfiles/dot_config/just;
|
||||||
"kitty".source = ./dotfiles/dot_config/kitty;
|
"kitty".source = ./dotfiles/dot_config/kitty;
|
||||||
"ghostty".source = ./dotfiles/dot_config/ghostty;
|
"ghostty".source = ./dotfiles/dot_config/ghostty;
|
||||||
"micro".source = ./dotfiles/dot_config/micro;
|
"micro".source = ./dotfiles/dot_config/micro;
|
||||||
|
"niri".source = ./dotfiles/dot_config/niri;
|
||||||
|
"nushell/lsp.nu".text = ''
|
||||||
|
source ~/.config/nushell/my_config/lsp.nu
|
||||||
|
'';
|
||||||
"neovide".source = ./dotfiles/dot_config/neovide;
|
"neovide".source = ./dotfiles/dot_config/neovide;
|
||||||
"glow".source = ./dotfiles/dot_config/glow;
|
"glow".source = ./dotfiles/dot_config/glow;
|
||||||
"glamour".source = ./dotfiles/dot_config/glamour;
|
"glamour".source = ./dotfiles/dot_config/glamour;
|
||||||
"starship.toml".source = ./dotfiles/dot_config/starship.toml;
|
"starship.toml".source = ./dotfiles/dot_config/starship.toml;
|
||||||
|
"elephant/websearch.toml".source = ./dotfiles/dot_config/elephant/websearch.toml;
|
||||||
|
"walker".source = ./dotfiles/dot_config/walker;
|
||||||
"waybar".source = ./dotfiles/dot_config/waybar;
|
"waybar".source = ./dotfiles/dot_config/waybar;
|
||||||
"euporie".source = ./dotfiles/dot_config/euporie;
|
# "euporie".source = ./dotfiles/dot_config/euporie;
|
||||||
"bottom".source = ./dotfiles/dot_config/bottom;
|
"bottom".source = ./dotfiles/dot_config/bottom;
|
||||||
"swaync".source = ./dotfiles/dot_config/swaync;
|
"swaync".source = ./dotfiles/dot_config/swaync;
|
||||||
"zellij".source = ./dotfiles/dot_config/zellij;
|
"zellij".source = ./dotfiles/dot_config/zellij;
|
||||||
@@ -73,7 +151,6 @@
|
|||||||
"hg".source = ./dotfiles/dot_config/hg;
|
"hg".source = ./dotfiles/dot_config/hg;
|
||||||
"stylua.toml".source = ./dotfiles/dot_config/stylua.toml;
|
"stylua.toml".source = ./dotfiles/dot_config/stylua.toml;
|
||||||
"electron-flags.conf".source = ./dotfiles/dot_config/electron-flags.conf;
|
"electron-flags.conf".source = ./dotfiles/dot_config/electron-flags.conf;
|
||||||
"Kvantum".source = ./dotfiles/dot_config/Kvantum;
|
|
||||||
"foot".source = ./dotfiles/dot_config/foot;
|
"foot".source = ./dotfiles/dot_config/foot;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,5 +17,8 @@
|
|||||||
unstablePkgs.lazygit
|
unstablePkgs.lazygit
|
||||||
unstablePkgs.nixd
|
unstablePkgs.nixd
|
||||||
unstablePkgs.nushell
|
unstablePkgs.nushell
|
||||||
|
unstablePkgs.nh
|
||||||
|
unstablePkgs.nix-output-monitor
|
||||||
|
unstablePkgs.nvd
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,41 @@
|
|||||||
];
|
];
|
||||||
programs = {
|
programs = {
|
||||||
home-manager.enable = true;
|
home-manager.enable = true;
|
||||||
|
nushell = let
|
||||||
|
pkgStream = unstablePkgs;
|
||||||
|
in {
|
||||||
|
enable = true;
|
||||||
|
package = pkgStream.nushell;
|
||||||
|
plugins = with pkgStream.nushellPlugins; [
|
||||||
|
# bson
|
||||||
|
# desktop_notifications
|
||||||
|
formats
|
||||||
|
gstat
|
||||||
|
# highlight
|
||||||
|
polars
|
||||||
|
query
|
||||||
|
# semver
|
||||||
|
];
|
||||||
|
extraConfig = ''
|
||||||
|
source ~/.config/nushell/my_config/config.nu
|
||||||
|
'';
|
||||||
|
extraEnv = ''
|
||||||
|
source ~/.config/nushell/my_config/env.nu
|
||||||
|
'';
|
||||||
|
};
|
||||||
git.enable = true;
|
git.enable = true;
|
||||||
|
carapace = {
|
||||||
|
enable = true;
|
||||||
|
enableNushellIntegration = true;
|
||||||
|
};
|
||||||
|
zoxide = {
|
||||||
|
enable = true;
|
||||||
|
enableNushellIntegration = true;
|
||||||
|
};
|
||||||
|
lazygit = {
|
||||||
|
enable = true;
|
||||||
|
package = unstablePkgs.lazygit;
|
||||||
|
enableNushellIntegration = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
"yazi/plugins/chmod.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/chmod.yazi;
|
"yazi/plugins/chmod.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/chmod.yazi;
|
||||||
"yazi/plugins/full-border.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/full-border.yazi;
|
"yazi/plugins/full-border.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/full-border.yazi;
|
||||||
"yazi/plugins/git.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/git.yazi;
|
"yazi/plugins/git.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/git.yazi;
|
||||||
"yazi/plugins/glow.yazi".source = ../dotfiles/dot_config/yazi/plugins/glow.yazi;
|
|
||||||
"yazi/plugins/hexyl.yazi".source = ../dotfiles/dot_config/yazi/plugins/hexyl.yazi;
|
"yazi/plugins/hexyl.yazi".source = ../dotfiles/dot_config/yazi/plugins/hexyl.yazi;
|
||||||
"yazi/plugins/max-preview.yazi".source = ../dotfiles/dot_config/yazi/plugins/max-preview.yazi;
|
"yazi/plugins/max-preview.yazi".source = ../dotfiles/dot_config/yazi/plugins/max-preview.yazi;
|
||||||
"yazi/plugins/mime-ext.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/mime-ext.yazi;
|
"yazi/plugins/mime-ext.yazi".source = ../dotfiles/dot_config/yazi/plugins/core/mime-ext.yazi;
|
||||||
|
|||||||
@@ -10,5 +10,9 @@
|
|||||||
home = {
|
home = {
|
||||||
username = "cianh";
|
username = "cianh";
|
||||||
homeDirectory = "/home/cianh";
|
homeDirectory = "/home/cianh";
|
||||||
|
shell.enableNushellIntegration = true;
|
||||||
|
sessionPath = [
|
||||||
|
"$HOME/.local/bin"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
imports = [
|
imports = [
|
||||||
./core.nix
|
./core.nix
|
||||||
./homeserver/packages.nix
|
./homeserver/packages.nix
|
||||||
./homeserver/programs.nix
|
|
||||||
./homeserver/containers.nix
|
./homeserver/containers.nix
|
||||||
inputs.sops-nix.homeManagerModules.sops
|
inputs.sops-nix.homeManagerModules.sops
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
./containers/media.nix
|
./containers/media.nix
|
||||||
./containers/monitoring.nix
|
# ./containers/metrics.nix
|
||||||
./containers/caddy.nix
|
./containers/caddy.nix
|
||||||
./containers/work_tools.nix
|
./containers/work_tools.nix
|
||||||
./containers/nextcloud.nix
|
./containers/nextcloud.nix
|
||||||
|
|||||||
@@ -21,9 +21,11 @@
|
|||||||
volumes = [
|
volumes = [
|
||||||
"/home/cianh/caddy/config:/etc/caddy"
|
"/home/cianh/caddy/config:/etc/caddy"
|
||||||
"/home/cianh/caddy/data:/data:Z"
|
"/home/cianh/caddy/data:/data:Z"
|
||||||
|
"/home/cianh/caddy/logs:/var/log/caddy"
|
||||||
"/home/cianh/caddy/placeholder_site:/var/www/site:Z"
|
"/home/cianh/caddy/placeholder_site:/var/www/site:Z"
|
||||||
"/home/cianh/blog:/var/www/blog:Z"
|
"/home/cianh/blog:/var/www/blog:Z"
|
||||||
"/home/cianh/Nextcloud:/var/www/nextcloud:Z"
|
"/home/cianh/Nextcloud:/var/www/nextcloud:Z"
|
||||||
|
"/home/cianh/goaccess/site:/var/www/goaccess:Z"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
outputs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
unstablePkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
services.podman = {
|
||||||
|
containers = {
|
||||||
|
goaccess = {
|
||||||
|
image = "docker.io/allinurl/goaccess:latest";
|
||||||
|
exec = "--output=/var/www/goaccess/index.html --log-file=/var/log/caddy/access.log --log-format=CADDY --tz=Europe/Dublin --anonymize-ip --real-time-html --ws-url=wss://metrics.bulba.space:443/ws --port=7890 --origin=metrics.bulba.space";
|
||||||
|
autoUpdate = "registry";
|
||||||
|
network = [
|
||||||
|
"proxy-net"
|
||||||
|
];
|
||||||
|
volumes = [
|
||||||
|
"/home/cianh/caddy/logs:/var/log/caddy:Z"
|
||||||
|
"/home/cianh/goaccess/site:/var/www/goaccess"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
inputs,
|
|
||||||
outputs,
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
unstablePkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
services.podman = {
|
|
||||||
networks = {
|
|
||||||
grafana-net = {};
|
|
||||||
};
|
|
||||||
containers = {
|
|
||||||
grafana = {
|
|
||||||
image = "docker.io/grafana/grafana:latest";
|
|
||||||
autoUpdate = "registry";
|
|
||||||
network = ["grafana-net"];
|
|
||||||
user = "1000:1000";
|
|
||||||
volumes = [
|
|
||||||
"/home/cianh/grafana:/var/lib/grafana:Z"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
prometheus = {
|
|
||||||
image = "docker.io/prom/prometheus:latest";
|
|
||||||
autoUpdate = "registry";
|
|
||||||
network = [
|
|
||||||
"grafana-net"
|
|
||||||
"proxy-net"
|
|
||||||
];
|
|
||||||
volumes = [
|
|
||||||
"/home/cianh/prometheus/:/etc/prometheus/"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
volumes = [
|
volumes = [
|
||||||
"/home/cianh/vikunja/files:/app/vikunja/files"
|
"/home/cianh/vikunja/files:/app/vikunja/files"
|
||||||
];
|
];
|
||||||
|
extraPodmanArgs = ["--userns=keep-id"];
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
Unit = {
|
Unit = {
|
||||||
After = "podman-vikunja-db.service";
|
After = "podman-vikunja-db.service";
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
inputs,
|
|
||||||
outputs,
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
unstablePkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
programs = {
|
|
||||||
bash.enable = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -14,5 +14,6 @@
|
|||||||
./worklaptop/programs.nix
|
./worklaptop/programs.nix
|
||||||
./worklaptop/defaultapps.nix
|
./worklaptop/defaultapps.nix
|
||||||
./worklaptop/theming.nix
|
./worklaptop/theming.nix
|
||||||
|
inputs.nixers-repo.homeManagerModules.walker
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,41 +5,38 @@
|
|||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
unstablePkgs,
|
unstablePkgs,
|
||||||
|
nixers,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
# Patch vivaldi to ensure reliability on wayland
|
|
||||||
vivaldi-wayland = pkgs.symlinkJoin {
|
|
||||||
name = "vivaldi-wayland";
|
|
||||||
paths = [pkgs.vivaldi];
|
|
||||||
buildInputs = [pkgs.makeWrapper];
|
|
||||||
postBuild = ''
|
|
||||||
wrapProgram $out/bin/vivaldi \
|
|
||||||
--set NIXOS_OZONE_WL 1 \
|
|
||||||
--add-flags "--ozone-platform=wayland --enable-features=UseOzonePlatform --ozone-platform-hint=auto"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
python = pkgs.python314.withPackages (
|
|
||||||
python-pkgs: [
|
|
||||||
python-pkgs.pkginfo
|
|
||||||
python-pkgs.setuptools
|
|
||||||
python-pkgs.uv
|
|
||||||
]
|
|
||||||
);
|
|
||||||
in {
|
in {
|
||||||
home.packages = [
|
home.packages = [
|
||||||
pkgs.bitwarden-desktop
|
pkgs.bitwarden-desktop
|
||||||
pkgs.blueman
|
pkgs.babashka
|
||||||
|
pkgs.bat-extras.batman
|
||||||
|
pkgs.bat-extras.batdiff
|
||||||
|
pkgs.bat-extras.batgrep
|
||||||
|
pkgs.bat-extras.prettybat
|
||||||
|
pkgs.broot
|
||||||
|
pkgs.clapper
|
||||||
|
pkgs.cliphist
|
||||||
pkgs.distrobox
|
pkgs.distrobox
|
||||||
|
pkgs.dvc
|
||||||
pkgs.feh
|
pkgs.feh
|
||||||
|
pkgs.git-lfs
|
||||||
pkgs.go
|
pkgs.go
|
||||||
|
unstablePkgs.gurk-rs
|
||||||
pkgs.has
|
pkgs.has
|
||||||
pkgs.hyperfine
|
pkgs.hyperfine
|
||||||
pkgs.imagemagick
|
pkgs.imagemagick
|
||||||
|
pkgs.jujutsu
|
||||||
pkgs.kubectl
|
pkgs.kubectl
|
||||||
|
pkgs.lnav
|
||||||
pkgs.lynx
|
pkgs.lynx
|
||||||
pkgs.minikube
|
pkgs.minikube
|
||||||
unstablePkgs.mission-center
|
unstablePkgs.mission-center
|
||||||
pkgs.neovide
|
pkgs.neovide
|
||||||
|
pkgs.nix-tree
|
||||||
|
pkgs.nh
|
||||||
pkgs.nodejs_24
|
pkgs.nodejs_24
|
||||||
pkgs.nwg-look
|
pkgs.nwg-look
|
||||||
unstablePkgs.obsidian
|
unstablePkgs.obsidian
|
||||||
@@ -50,24 +47,32 @@ in {
|
|||||||
unstablePkgs.podman-desktop
|
unstablePkgs.podman-desktop
|
||||||
unstablePkgs.podman-tui
|
unstablePkgs.podman-tui
|
||||||
pkgs.popsicle
|
pkgs.popsicle
|
||||||
python
|
nixers.python-env
|
||||||
pkgs.smile
|
nixers.rbw-autofill
|
||||||
|
unstablePkgs.ruff
|
||||||
|
pkgs.signal-desktop
|
||||||
|
unstablePkgs.sone
|
||||||
pkgs.sshs
|
pkgs.sshs
|
||||||
|
unstablePkgs.uv
|
||||||
pkgs.vial
|
pkgs.vial
|
||||||
vivaldi-wayland
|
nixers.vivaldi-wayland
|
||||||
|
unstablePkgs.visidata
|
||||||
pkgs.vivaldi-ffmpeg-codecs
|
pkgs.vivaldi-ffmpeg-codecs
|
||||||
|
nixers.walker-obsidian-search
|
||||||
pkgs.warpinator
|
pkgs.warpinator
|
||||||
pkgs.xarchiver
|
pkgs.xarchiver
|
||||||
|
pkgs.yubikey-agent
|
||||||
|
pkgs.yubikey-manager
|
||||||
pkgs.zathura
|
pkgs.zathura
|
||||||
pkgs.zettlr
|
pkgs.zeal
|
||||||
unstablePkgs.zed-editor
|
unstablePkgs.zed-editor
|
||||||
unstablePkgs.zotero
|
unstablePkgs.zotero
|
||||||
inputs.zen-browser.packages.x86_64-linux.default
|
nixers.zen-browser
|
||||||
# theming
|
# theming
|
||||||
|
pkgs.adwaita-icon-theme
|
||||||
pkgs.gtk-engine-murrine
|
pkgs.gtk-engine-murrine
|
||||||
pkgs.gtk_engines
|
pkgs.gtk_engines
|
||||||
pkgs.phinger-cursors
|
pkgs.hicolor-icon-theme
|
||||||
pkgs.tokyonight-gtk-theme
|
|
||||||
# Backend dev tools
|
# Backend dev tools
|
||||||
pkgs.lua54Packages.lua
|
pkgs.lua54Packages.lua
|
||||||
pkgs.luajitPackages.luarocks
|
pkgs.luajitPackages.luarocks
|
||||||
|
|||||||
@@ -5,16 +5,33 @@
|
|||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
unstablePkgs,
|
unstablePkgs,
|
||||||
|
nixers,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
|
imports = [
|
||||||
|
inputs.noctalia.homeModules.default
|
||||||
|
];
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
nix-your-shell = {
|
nix-your-shell = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableNushellIntegration = true;
|
enableNushellIntegration = true;
|
||||||
};
|
};
|
||||||
waybar = {
|
direnv = {
|
||||||
enable = true;
|
enable = true;
|
||||||
systemd.enable = true;
|
enableNushellIntegration = true;
|
||||||
|
};
|
||||||
|
noctalia-shell.enable = true;
|
||||||
|
walker = {
|
||||||
|
enable = true;
|
||||||
|
runAsService = true;
|
||||||
|
};
|
||||||
|
rbw = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
email = "chughes000@gmail.com";
|
||||||
|
pinentry = nixers.rbw-autofill;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
hyprcursor-phinger.enable = true;
|
hyprcursor-phinger.enable = true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,8 +8,26 @@
|
|||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
services = {
|
services = {
|
||||||
swaync.enable = true;
|
|
||||||
pueue.enable = true;
|
pueue.enable = true;
|
||||||
hyprpaper.enable = true;
|
};
|
||||||
|
# Custom version of ghostty service, to stop closing during update
|
||||||
|
systemd.user.services."app-com.mitchellh.ghostty" = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Ghostty Terminal Emulator";
|
||||||
|
X-SwitchMethod = "keep-old";
|
||||||
|
After = ["graphical-session.target"];
|
||||||
|
PartOf = ["graphical-session.target"];
|
||||||
|
};
|
||||||
|
Service = {
|
||||||
|
ExecStart = "${lib.getExe config.programs.ghostty.package}";
|
||||||
|
Environment = "WAYLAND_DISPLAY=wayland-1";
|
||||||
|
Type = "notify";
|
||||||
|
ReloadSignal = "SIGUSR2";
|
||||||
|
KillMode = "mixed";
|
||||||
|
Restart = "on-failure";
|
||||||
|
};
|
||||||
|
Install = {
|
||||||
|
WantedBy = ["graphical-session.target"];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,22 +5,23 @@
|
|||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
unstablePkgs,
|
unstablePkgs,
|
||||||
|
theme,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
# GTK theming
|
# GTK theming
|
||||||
gtk = {
|
gtk = {
|
||||||
enable = true;
|
enable = true;
|
||||||
iconTheme = {
|
iconTheme = {
|
||||||
name = "Tokyonight-Light";
|
name = theme.iconTheme.name;
|
||||||
package = pkgs.tokyonight-gtk-theme;
|
package = theme.iconTheme.package;
|
||||||
};
|
};
|
||||||
theme = {
|
theme = {
|
||||||
name = "Tokyonight-Dark";
|
name = theme.gtkTheme.name;
|
||||||
package = pkgs.tokyonight-gtk-theme;
|
package = theme.gtkTheme.package;
|
||||||
};
|
};
|
||||||
cursorTheme = {
|
cursorTheme = {
|
||||||
name = "phinger-cursors-dark";
|
name = theme.cursorTheme.name;
|
||||||
package = pkgs.phinger-cursors;
|
package = theme.cursorTheme.package;
|
||||||
};
|
};
|
||||||
gtk2.extraConfig = ''
|
gtk2.extraConfig = ''
|
||||||
gtk-theme-name="Tokyonight-Dark"
|
gtk-theme-name="Tokyonight-Dark"
|
||||||
@@ -38,13 +39,34 @@
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# QT theming
|
||||||
|
qt = {
|
||||||
|
enable = true;
|
||||||
|
platformTheme.name = "kvantum";
|
||||||
|
style.name = "kvantum";
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.configFile."Kvantum/kvantum.kvconfig".text = ''
|
||||||
|
[General]
|
||||||
|
theme=${theme.qtTheme.name}
|
||||||
|
'';
|
||||||
|
|
||||||
# dconf theming settings
|
# dconf theming settings
|
||||||
dconf.settings = {
|
dconf.settings = {
|
||||||
"org/gnome/desktop/interface" = {
|
"org/gnome/desktop/interface" = {
|
||||||
color-scheme = "prefer-dark";
|
color-scheme = "prefer-dark";
|
||||||
gtk-theme = "Tokyonight-Dark";
|
gtk-theme = theme.gtkTheme.name;
|
||||||
icon-theme = "Tokyonight-Light";
|
icon-theme = theme.iconTheme.name;
|
||||||
cursor-theme = "phinger-cursors-dark";
|
cursor-theme = theme.cursorTheme.name;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Ensure theming packages are installed
|
||||||
|
home.packages = [
|
||||||
|
theme.gtkTheme.package
|
||||||
|
theme.qtTheme.package
|
||||||
|
theme.iconTheme.package
|
||||||
|
theme.cursorTheme.package
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +1,132 @@
|
|||||||
|
set shell := ["bash", "-c"]
|
||||||
|
|
||||||
|
git := "true"
|
||||||
|
flake := "true"
|
||||||
|
flatpak := "true"
|
||||||
|
|
||||||
|
# Show this interactive menu
|
||||||
default:
|
default:
|
||||||
@just --list
|
@just --choose
|
||||||
|
|
||||||
prebuild:
|
_git-sync:
|
||||||
git pull --recurse
|
@if [ -n "$(git status --porcelain)" ]; then \
|
||||||
git submodule update --remote --recursive
|
if git status --porcelain | grep -q "flake.lock"; then \
|
||||||
nix flake update
|
echo ">> flake.lock is dirty. Resetting to avoid pull conflicts..."; \
|
||||||
|
git checkout flake.lock; \
|
||||||
_update-root:
|
fi; \
|
||||||
if `/usr/bin/env grep -Rq "nixos" /etc/*-release`; then \
|
if [ -n "$(git status --porcelain)" ]; then \
|
||||||
sudo nixos-rebuild switch --flake .?submodules=1#$HOSTNAME; \
|
echo ">> Stashing remaining local changes..."; \
|
||||||
|
git stash; \
|
||||||
|
git pull --ff-only --recurse-submodules; \
|
||||||
|
git submodule update --remote --recursive; \
|
||||||
|
git stash pop; \
|
||||||
|
else \
|
||||||
|
git pull --ff-only --recurse-submodules; \
|
||||||
|
git submodule update --remote --recursive; \
|
||||||
|
fi; \
|
||||||
|
else \
|
||||||
|
git pull --ff-only --recurse-submodules; \
|
||||||
|
git submodule update --remote --recursive; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
_flake-update:
|
||||||
|
nix flake update
|
||||||
|
|
||||||
|
# Safely commit the lockfile changes
|
||||||
|
commit-lock:
|
||||||
|
git add flake.lock
|
||||||
|
git commit -m "chore: update flake.lock" || echo "No changes to commit"
|
||||||
|
|
||||||
|
# Sync git and update flake inputs (override with git=false or flake=false)
|
||||||
|
prebuild:
|
||||||
|
@if [ "{{git}}" == "true" ]; then \
|
||||||
|
echo ">> Syncing Git..."; \
|
||||||
|
just _git-sync; \
|
||||||
|
fi
|
||||||
|
@if [ "{{flake}}" == "true" ]; then \
|
||||||
|
echo ">> Updating Flake..."; \
|
||||||
|
just _flake-update; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
_update-root:
|
||||||
|
@if [ -f /etc/NIXOS ] && grep -q "nixos" /etc/os-release 2>/dev/null; then \
|
||||||
|
sudo nixos-rebuild switch --flake .?submodules=1#$(hostname); \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Rebuild and switch NixOS system configuration
|
||||||
update-root: prebuild _update-root
|
update-root: prebuild _update-root
|
||||||
|
|
||||||
|
# Install Home Manager standalone (useful for initial non-NixOS setup)
|
||||||
install-home:
|
install-home:
|
||||||
home-manager switch --flake .?submodules=1#$USER@core \
|
home-manager switch --flake .?submodules=1#$(whoami)@core \
|
||||||
--extra-experimental-features nix-command \
|
--extra-experimental-features nix-command \
|
||||||
--extra-experimental-features flakes
|
--extra-experimental-features flakes
|
||||||
|
|
||||||
_update-home:
|
_update-home:
|
||||||
home-manager switch --flake .?submodules=1#$USER@$HOSTNAME \
|
home-manager switch --flake .?submodules=1#$(whoami)@$(hostname) \
|
||||||
|| home-manager switch --flake .?submodules=1#$USER@core
|
|| home-manager switch --flake .?submodules=1#$(whoami)@core
|
||||||
|
|
||||||
|
# Rebuild and switch Home Manager configuration
|
||||||
update-home: prebuild _update-home
|
update-home: prebuild _update-home
|
||||||
|
|
||||||
update: prebuild _update-root _update-home
|
# Quick update skipping git and flake syncs
|
||||||
|
quick-update:
|
||||||
|
just git=false flake=false update
|
||||||
|
|
||||||
cleanup:
|
# Update the system without fetching the latest git commits
|
||||||
|
nogit-update:
|
||||||
|
just git=false update
|
||||||
|
|
||||||
|
# Update and clean up Flatpak packages
|
||||||
|
update-flatpaks:
|
||||||
|
@if [ "{{flatpak}}" == "true" ] && command -v flatpak &> /dev/null; then \
|
||||||
|
echo ">> Updating Flatpaks..."; \
|
||||||
|
flatpak update -y; \
|
||||||
|
flatpak uninstall --unused -y; \
|
||||||
|
else \
|
||||||
|
echo ">> Flatpak not found or disabled. Skipping."; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# View the 5 most recent NixOS and Home Manager generations
|
||||||
|
history:
|
||||||
|
@echo ">> System Generations:"
|
||||||
|
@nix-env -p /nix/var/nix/profiles/system --list-generations | tail -n 5
|
||||||
|
@echo "\n>> Home Manager Generations:"
|
||||||
|
@home-manager generations | head -n 5
|
||||||
|
|
||||||
|
# Open a Nix REPL loaded with the current flake
|
||||||
|
repl:
|
||||||
|
nix repl --file flake.nix
|
||||||
|
|
||||||
|
# Fully update the system, home-manager, and flatpaks
|
||||||
|
update: prebuild _update-root _update-home update-flatpaks
|
||||||
|
|
||||||
|
# Preview system changes without activating them
|
||||||
|
dry-run: prebuild
|
||||||
|
sudo nixos-rebuild dry-activate --flake .?submodules=1#$(hostname)
|
||||||
|
|
||||||
|
# Run Nix and Flatpak garbage collection. Optionally specify age (e.g., 'just cleanup 7d')
|
||||||
|
cleanup days="":
|
||||||
|
@if [ -n "{{days}}" ]; then \
|
||||||
|
echo ">> Deleting system generations older than {{days}}..."; \
|
||||||
|
sudo nix-collect-garbage --delete-older-than {{days}}; \
|
||||||
|
fi
|
||||||
|
@echo ">> Cleaning Nix Store..."
|
||||||
nix-store --gc
|
nix-store --gc
|
||||||
nix-store --optimise
|
nix-store --optimise
|
||||||
|
@if command -v flatpak &> /dev/null; then \
|
||||||
|
echo ">> Cleaning unused Flatpaks..."; \
|
||||||
|
flatpak uninstall --unused -y; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Open the editor (nvim, yazi, or heh) for a target
|
||||||
|
edit target:
|
||||||
|
@direnv exec . scripts/edit.py "{{target}}"
|
||||||
|
|
||||||
|
# Edit packages.nix for a specific system/user (run 'just packages help' for flags)
|
||||||
|
packages *flags:
|
||||||
|
@direnv exec . scripts/packages.bb {{flags}}
|
||||||
|
|
||||||
|
# Bootstrap a fresh system from the repo
|
||||||
|
bootstrap:
|
||||||
|
@direnv exec . scripts/bootstrap.py
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
environment.systemPackages = [
|
environment.systemPackages = [
|
||||||
pkgs.atuin
|
pkgs.atuin
|
||||||
pkgs.bat
|
pkgs.bat
|
||||||
pkgs.bitwarden-cli
|
|
||||||
pkgs.bottom
|
pkgs.bottom
|
||||||
pkgs.delta
|
pkgs.delta
|
||||||
pkgs.dust
|
pkgs.dust
|
||||||
@@ -25,6 +24,7 @@
|
|||||||
pkgs.glab
|
pkgs.glab
|
||||||
pkgs.glow
|
pkgs.glow
|
||||||
pkgs.gnupg
|
pkgs.gnupg
|
||||||
|
pkgs.heh
|
||||||
pkgs.hexyl
|
pkgs.hexyl
|
||||||
pkgs.killall
|
pkgs.killall
|
||||||
pkgs.libsecret
|
pkgs.libsecret
|
||||||
@@ -37,16 +37,19 @@
|
|||||||
pkgs.passh
|
pkgs.passh
|
||||||
pkgs.pkg-config
|
pkgs.pkg-config
|
||||||
pkgs.pueue
|
pkgs.pueue
|
||||||
|
pkgs.rbw
|
||||||
pkgs.ripgrep
|
pkgs.ripgrep
|
||||||
pkgs.rm-improved
|
pkgs.rm-improved
|
||||||
pkgs.starship
|
pkgs.starship
|
||||||
pkgs.tealdeer
|
pkgs.tealdeer
|
||||||
pkgs.wget
|
pkgs.wget
|
||||||
pkgs.wl-clipboard
|
pkgs.wl-clipboard
|
||||||
|
pkgs.wtype
|
||||||
pkgs.xclip
|
pkgs.xclip
|
||||||
pkgs.xcp
|
pkgs.xcp
|
||||||
pkgs.zellij
|
pkgs.zellij
|
||||||
pkgs.zoxide
|
pkgs.zoxide
|
||||||
|
unstablePkgs.binsider
|
||||||
unstablePkgs.just
|
unstablePkgs.just
|
||||||
unstablePkgs.neovim
|
unstablePkgs.neovim
|
||||||
unstablePkgs.nushell
|
unstablePkgs.nushell
|
||||||
|
|||||||
@@ -9,4 +9,11 @@
|
|||||||
imports = [
|
imports = [
|
||||||
./programs/neovim.nix
|
./programs/neovim.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
|
programs.nh = {
|
||||||
|
enable = true;
|
||||||
|
clean.enable = true;
|
||||||
|
clean.extraArgs = "--keep-since 7d --keep 5";
|
||||||
|
flake = "/home/cianh/.config/nix";
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,7 @@
|
|||||||
users.users = {
|
users.users = {
|
||||||
cianh = {
|
cianh = {
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
|
linger = true;
|
||||||
hashedPasswordFile = "/etc/hashedPasswordFile";
|
hashedPasswordFile = "/etc/hashedPasswordFile";
|
||||||
description = "Cian Hughes";
|
description = "Cian Hughes";
|
||||||
extraGroups = ["networkmanager" "wheel" "docker" "podman" "nixcfg"];
|
extraGroups = ["networkmanager" "wheel" "docker" "podman" "nixcfg"];
|
||||||
|
|||||||
+16
-10
@@ -75,10 +75,15 @@
|
|||||||
blacklistedKernelModules = ["nouveau"];
|
blacklistedKernelModules = ["nouveau"];
|
||||||
};
|
};
|
||||||
|
|
||||||
networking.hostName = "worklaptop"; # Define your hostname.
|
# Configure networking
|
||||||
|
networking = {
|
||||||
# Enable networking
|
hostName = "worklaptop"; # Define your hostname.
|
||||||
networking.networkmanager.enable = true;
|
wireless.iwd.enable = true;
|
||||||
|
networkmanager = {
|
||||||
|
enable = true;
|
||||||
|
wifi.backend = "iwd";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
# Set your time zone.
|
# Set your time zone.
|
||||||
time.timeZone = "Europe/Dublin";
|
time.timeZone = "Europe/Dublin";
|
||||||
@@ -101,11 +106,6 @@
|
|||||||
nix = {
|
nix = {
|
||||||
registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs);
|
registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs);
|
||||||
nixPath = ["nixpkgs=${inputs.nixpkgs}"];
|
nixPath = ["nixpkgs=${inputs.nixpkgs}"];
|
||||||
gc = {
|
|
||||||
automatic = true;
|
|
||||||
dates = "daily";
|
|
||||||
options = "--delete-older-than 14d";
|
|
||||||
};
|
|
||||||
settings = {
|
settings = {
|
||||||
experimental-features = "nix-command flakes";
|
experimental-features = "nix-command flakes";
|
||||||
auto-optimise-store = true;
|
auto-optimise-store = true;
|
||||||
@@ -138,8 +138,14 @@
|
|||||||
stateVersion = "23.11"; # Did you read the comment?
|
stateVersion = "23.11"; # Did you read the comment?
|
||||||
autoUpgrade.enable = true;
|
autoUpgrade.enable = true;
|
||||||
autoUpgrade.dates = "weekly";
|
autoUpgrade.dates = "weekly";
|
||||||
|
activationScripts.diff = ''
|
||||||
|
if [[ -e /run/current-system ]]; then
|
||||||
|
${pkgs.nushell}/bin/nu -c "let diff_closure = (${pkgs.nix}/bin/nix store diff-closures /run/current-system '$systemConfig'); let table = (\$diff_closure | lines | where \$it =~ KiB | where \$it =~ → | parse -r '^(?<Package>\S+): (?<Old>[^,]+)(?:.*) → (?<New>[^,]+)(?:.*), (?<DiffBin>.*)$' | insert Diff { get DiffBin | ansi strip | into filesize } | sort-by -r Diff | reject DiffBin); if (\$table | get Diff | is-not-empty) { print \"\"; \$table | append [[Package Old New Diff]; [\"\" \"\" \"\" \"\"]] | append [[Package Old New Diff]; [\"\" \"\" \"Total:\" (\$table | get Diff | math sum) ]] | print; print \"\" }"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
zramSwap.enable = true; # enable RAM compression
|
||||||
|
|
||||||
# Set user config settings
|
# Set user config settings
|
||||||
users.defaultUserShell = pkgs.nushell;
|
users.defaultUserShell = unstablePkgs.nushell;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,12 +4,13 @@
|
|||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
unstablePkgs,
|
unstablePkgs,
|
||||||
|
nixers,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
environment.systemPackages = [
|
environment.systemPackages = [
|
||||||
pkgs.cargo
|
pkgs.cargo
|
||||||
pkgs.flatpak
|
pkgs.flatpak
|
||||||
pkgs.gdm
|
pkgs.greetd
|
||||||
pkgs.grim
|
pkgs.grim
|
||||||
pkgs.grub2_efi
|
pkgs.grub2_efi
|
||||||
pkgs.nix-ld
|
pkgs.nix-ld
|
||||||
@@ -20,7 +21,9 @@
|
|||||||
pkgs.qmk
|
pkgs.qmk
|
||||||
pkgs.qmk-udev-rules
|
pkgs.qmk-udev-rules
|
||||||
pkgs.qmk_hid
|
pkgs.qmk_hid
|
||||||
|
pkgs.regreet
|
||||||
pkgs.seahorse
|
pkgs.seahorse
|
||||||
|
nixers.walker
|
||||||
pkgs.wayland
|
pkgs.wayland
|
||||||
pkgs.wayland-utils
|
pkgs.wayland-utils
|
||||||
pkgs.xfce.thunar
|
pkgs.xfce.thunar
|
||||||
@@ -28,14 +31,9 @@
|
|||||||
pkgs.xh
|
pkgs.xh
|
||||||
unstablePkgs.ghostty
|
unstablePkgs.ghostty
|
||||||
unstablePkgs.hyprland
|
unstablePkgs.hyprland
|
||||||
unstablePkgs.hyprlock
|
|
||||||
unstablePkgs.hyprpaper
|
|
||||||
unstablePkgs.hyprpicker
|
unstablePkgs.hyprpicker
|
||||||
unstablePkgs.hyprshot
|
unstablePkgs.hyprshot
|
||||||
unstablePkgs.kitty
|
unstablePkgs.kitty
|
||||||
unstablePkgs.libnotify
|
unstablePkgs.libnotify
|
||||||
unstablePkgs.swaynotificationcenter
|
|
||||||
unstablePkgs.waybar
|
|
||||||
unstablePkgs.wofi
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
+104
-59
@@ -4,66 +4,111 @@
|
|||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
unstablePkgs,
|
unstablePkgs,
|
||||||
|
theme,
|
||||||
...
|
...
|
||||||
}: {
|
}: let
|
||||||
|
username = "cianh";
|
||||||
|
in {
|
||||||
# Activate DEs
|
# Activate DEs
|
||||||
programs.uwsm.enable = true;
|
programs = {
|
||||||
programs.hyprland = {
|
uwsm = {
|
||||||
enable = true;
|
enable = true;
|
||||||
withUWSM = true;
|
waylandCompositors.hyprland.binPath = lib.mkForce "/run/current-system/sw/bin/start-hyprland";
|
||||||
xwayland.enable = true;
|
};
|
||||||
|
regreet = {
|
||||||
|
enable = true;
|
||||||
|
theme = {
|
||||||
|
name = theme.gtkTheme.name;
|
||||||
|
package = theme.gtkTheme.package;
|
||||||
|
};
|
||||||
|
cursorTheme = {
|
||||||
|
name = theme.cursorTheme.name;
|
||||||
|
package = theme.cursorTheme.package;
|
||||||
|
};
|
||||||
|
iconTheme = {
|
||||||
|
name = theme.iconTheme.name;
|
||||||
|
package = theme.iconTheme.package;
|
||||||
|
};
|
||||||
|
font = {
|
||||||
|
name = "Noto Sans";
|
||||||
|
size = 16;
|
||||||
|
package = pkgs.noto-fonts;
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
GTK.application_prefer_dark_theme = true;
|
||||||
|
appearance.greeting_msg = "Hello ${username}, welcome back to '${config.networking.hostName}'!";
|
||||||
|
background = {
|
||||||
|
path = theme.wallpaper;
|
||||||
|
fit = "Cover";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
hyprland = {
|
||||||
|
enable = true;
|
||||||
|
withUWSM = true;
|
||||||
|
xwayland.enable = true;
|
||||||
|
};
|
||||||
|
iio-hyprland.enable = true;
|
||||||
|
|
||||||
|
# Enable my preferred DE utilities
|
||||||
|
thunar = {
|
||||||
|
enable = true;
|
||||||
|
plugins = [
|
||||||
|
pkgs.xfce.thunar-volman
|
||||||
|
pkgs.xfce.thunar-archive-plugin
|
||||||
|
pkgs.xfce.thunar-media-tags-plugin
|
||||||
|
];
|
||||||
|
};
|
||||||
|
xfconf.enable = true;
|
||||||
|
|
||||||
|
# Disable automatically activated programs i dont want
|
||||||
|
foot.enable = false;
|
||||||
|
|
||||||
|
# Lets also activate some handy devenv tools
|
||||||
|
direnv = {
|
||||||
|
enable = true;
|
||||||
|
nix-direnv.enable = true;
|
||||||
|
};
|
||||||
|
nix-ld = {
|
||||||
|
enable = true;
|
||||||
|
libraries = [
|
||||||
|
pkgs.acl
|
||||||
|
pkgs.alsa-lib
|
||||||
|
pkgs.at-spi2-core
|
||||||
|
pkgs.attr
|
||||||
|
pkgs.bzip2
|
||||||
|
pkgs.curl
|
||||||
|
pkgs.dbus
|
||||||
|
pkgs.eget
|
||||||
|
pkgs.expat
|
||||||
|
pkgs.glib
|
||||||
|
pkgs.libsodium
|
||||||
|
pkgs.libssh
|
||||||
|
pkgs.libxml2
|
||||||
|
pkgs.nspr
|
||||||
|
pkgs.nss
|
||||||
|
pkgs.openssl
|
||||||
|
pkgs.pango
|
||||||
|
pkgs.stdenv.cc
|
||||||
|
pkgs.systemd
|
||||||
|
pkgs.util-linux
|
||||||
|
pkgs.vulkan-loader
|
||||||
|
pkgs.xz
|
||||||
|
pkgs.zlib
|
||||||
|
pkgs.zstd
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
seahorse.enable = true; # enable the graphical frontend
|
||||||
|
gnupg.agent = {
|
||||||
|
enable = true;
|
||||||
|
pinentryPackage = pkgs.pinentry-gnome3;
|
||||||
|
enableSSHSupport = true;
|
||||||
|
};
|
||||||
|
virt-manager.enable = true;
|
||||||
|
yubikey-touch-detector = {
|
||||||
|
enable = true;
|
||||||
|
libnotify = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Enable my preferred DE utilities
|
|
||||||
programs.thunar.enable = true;
|
|
||||||
programs.thunar.plugins = [
|
|
||||||
pkgs.xfce.thunar-volman
|
|
||||||
pkgs.xfce.thunar-archive-plugin
|
|
||||||
pkgs.xfce.thunar-media-tags-plugin
|
|
||||||
];
|
|
||||||
programs.xfconf.enable = true;
|
|
||||||
|
|
||||||
# Disable automatically activated programs i dont want
|
|
||||||
programs.foot.enable = false;
|
|
||||||
|
|
||||||
# Lets also activate some handy devenv tools
|
|
||||||
programs.direnv.enable = true;
|
|
||||||
programs.direnv.nix-direnv.enable = true;
|
|
||||||
programs.nix-ld = {
|
|
||||||
enable = true;
|
|
||||||
libraries = [
|
|
||||||
pkgs.acl
|
|
||||||
pkgs.alsa-lib
|
|
||||||
pkgs.at-spi2-core
|
|
||||||
pkgs.attr
|
|
||||||
pkgs.bzip2
|
|
||||||
pkgs.curl
|
|
||||||
pkgs.dbus
|
|
||||||
pkgs.eget
|
|
||||||
pkgs.expat
|
|
||||||
pkgs.glib
|
|
||||||
pkgs.libsodium
|
|
||||||
pkgs.libssh
|
|
||||||
pkgs.libxml2
|
|
||||||
pkgs.nspr
|
|
||||||
pkgs.nss
|
|
||||||
pkgs.openssl
|
|
||||||
pkgs.pango
|
|
||||||
pkgs.stdenv.cc
|
|
||||||
pkgs.systemd
|
|
||||||
pkgs.util-linux
|
|
||||||
pkgs.vulkan-loader
|
|
||||||
pkgs.xz
|
|
||||||
pkgs.zlib
|
|
||||||
pkgs.zstd
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.seahorse.enable = true; # enable the graphical frontend
|
|
||||||
programs.gnupg.agent = {
|
|
||||||
enable = true;
|
|
||||||
pinentryPackage = pkgs.pinentry-gnome3;
|
|
||||||
enableSSHSupport = true;
|
|
||||||
};
|
|
||||||
programs.virt-manager.enable = true;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,12 +4,14 @@
|
|||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
unstablePkgs,
|
unstablePkgs,
|
||||||
|
theme,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
services = {
|
services = {
|
||||||
displayManager.defaultSession = "hyprland-uwsm";
|
displayManager.defaultSession = "hyprland-uwsm";
|
||||||
desktopManager.gnome.enable = false;
|
desktopManager.gnome.enable = false;
|
||||||
displayManager.gdm.enable = true;
|
displayManager.gdm.enable = false;
|
||||||
|
greetd.enable = true;
|
||||||
xserver = {
|
xserver = {
|
||||||
videoDrivers = ["nvidia"]; # or "nvidiaLegacy470 etc.
|
videoDrivers = ["nvidia"]; # or "nvidiaLegacy470 etc.
|
||||||
enable = true;
|
enable = true;
|
||||||
@@ -18,12 +20,37 @@
|
|||||||
variant = "";
|
variant = "";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
resolved.enable = true;
|
||||||
|
upower.enable = true;
|
||||||
|
tuned.enable = true;
|
||||||
pulseaudio.enable = false;
|
pulseaudio.enable = false;
|
||||||
pipewire = {
|
pipewire = {
|
||||||
enable = true;
|
enable = true;
|
||||||
alsa.enable = true;
|
alsa.enable = true;
|
||||||
alsa.support32Bit = true;
|
alsa.support32Bit = true;
|
||||||
pulse.enable = true;
|
pulse.enable = true;
|
||||||
|
|
||||||
|
extraConfig.pipewire."99-high-res-audio" = {
|
||||||
|
"context.properties" = {
|
||||||
|
"default.clock.rate" = 48000;
|
||||||
|
"default.clock.allowed-rates" = [44100 48000 88200 96000 176400 192000];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wireplumber.extraConfig."10-high-res-audio" = {
|
||||||
|
"monitor.alsa.rules" = [
|
||||||
|
{
|
||||||
|
matches = [
|
||||||
|
{"node.name" = "~alsa_output.*";}
|
||||||
|
];
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
"audio.format" = "S32LE";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
gvfs.enable = true;
|
gvfs.enable = true;
|
||||||
@@ -32,30 +59,48 @@
|
|||||||
# Enable flatpaks
|
# Enable flatpaks
|
||||||
flatpak.enable = true;
|
flatpak.enable = true;
|
||||||
|
|
||||||
|
# Add guix, as it is a common tool for reproducibility in comp sci
|
||||||
|
guix.enable = true;
|
||||||
|
|
||||||
# Enable the OpenSSH daemon and other remote tools.
|
# Enable the OpenSSH daemon and other remote tools.
|
||||||
openssh.enable = true;
|
openssh.enable = true;
|
||||||
|
|
||||||
gnome.gnome-keyring.enable = true;
|
gnome.gnome-keyring.enable = true;
|
||||||
pcscd.enable = true;
|
pcscd.enable = true;
|
||||||
|
udev = {
|
||||||
|
packages = [
|
||||||
|
pkgs.yubikey-personalization
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Add custom services
|
# Add custom services
|
||||||
systemd.services = {
|
systemd.services = {
|
||||||
setup-user-icon = {
|
greetd = {
|
||||||
description = "Set user profile icon";
|
after = ["setup-user-vars.service"];
|
||||||
wantedBy = ["multi-user.target"];
|
requires = ["setup-user-vars.service"];
|
||||||
|
};
|
||||||
|
setup-user-vars = {
|
||||||
|
description = "Set user profile vars";
|
||||||
|
wantedBy = [
|
||||||
|
"multi-user.target"
|
||||||
|
"graphical-session.target"
|
||||||
|
];
|
||||||
after = ["home.mount"];
|
after = ["home.mount"];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "oneshot";
|
Type = "oneshot";
|
||||||
ExecStart = ''
|
ExecStart = ''
|
||||||
${pkgs.bash}/bin/bash -c " \
|
${pkgs.bash}/bin/bash -c " \
|
||||||
mkdir -p /var/lib/AccountsService/{icons,users} && \
|
mkdir -p /var/lib/AccountsService/{icons,users,wallpaper} && \
|
||||||
cp /home/cianh/Pictures/face.png /var/lib/AccountsService/icons/cianh && \
|
cp ${theme.avatarSource} ${theme.avatar} && \
|
||||||
echo '[User]\nSession=\nIcon=/var/lib/AccountsService/icons/cianh\nSystemAccount=false' > /var/lib/AccountsService/users/cianh && \
|
echo '[User]\nSession=\nIcon=${theme.avatar}\nSystemAccount=false' > /var/lib/AccountsService/users/cianh && \
|
||||||
chown root:root /var/lib/AccountsService/users/cianh && \
|
chown root:root /var/lib/AccountsService/users/cianh && \
|
||||||
chmod 0600 /var/lib/AccountsService/users/cianh && \
|
chmod 0600 /var/lib/AccountsService/users/cianh && \
|
||||||
chown root:root /var/lib/AccountsService/icons/cianh && \
|
chown root:root ${theme.avatar} && \
|
||||||
chmod 0444 /var/lib/AccountsService/icons/cianh \
|
chmod 0444 ${theme.avatar} && \
|
||||||
|
cp ${theme.wallpaperSource} ${theme.wallpaper} && \
|
||||||
|
chown root:root ${theme.wallpaper} && \
|
||||||
|
chmod 0444 ${theme.wallpaper} \
|
||||||
"
|
"
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,13 +3,17 @@
|
|||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
modulesPath,
|
modulesPath,
|
||||||
|
theme,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
# GTK theming
|
# Session Variable for GTK
|
||||||
environment.sessionVariables.GTK_THEME = "Tokyonight-Dark";
|
environment.sessionVariables.GTK_THEME = theme.gtkTheme.name;
|
||||||
|
|
||||||
# Delegate QT theming to kvantum
|
# QT config
|
||||||
environment.sessionVariables.QT_STYLE_OVERRIDE = "kvantum";
|
qt = {
|
||||||
|
enable = true;
|
||||||
|
style = "kvantum";
|
||||||
|
};
|
||||||
|
|
||||||
# Fonts
|
# Fonts
|
||||||
fonts = {
|
fonts = {
|
||||||
@@ -18,9 +22,9 @@
|
|||||||
|
|
||||||
fontconfig = {
|
fontconfig = {
|
||||||
defaultFonts = {
|
defaultFonts = {
|
||||||
serif = ["NotoSerifNerdFont"];
|
serif = [theme.fonts.serif];
|
||||||
sansSerif = ["NotoSansNerdFont"];
|
sansSerif = [theme.fonts.sansSerif];
|
||||||
monospace = ["MonaspiceArNerdFontMono"];
|
monospace = [theme.fonts.monospace];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -49,5 +53,10 @@
|
|||||||
# Adwaita (i love gnome, but god damn is adwaita annoying on other DEs)
|
# Adwaita (i love gnome, but god damn is adwaita annoying on other DEs)
|
||||||
pkgs.adwaita-icon-theme
|
pkgs.adwaita-icon-theme
|
||||||
pkgs.libadwaita
|
pkgs.libadwaita
|
||||||
|
# My theme packages set at the top level
|
||||||
|
theme.gtkTheme.package
|
||||||
|
theme.qtTheme.package
|
||||||
|
theme.iconTheme.package
|
||||||
|
theme.cursorTheme.package
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
Executable
+216
@@ -0,0 +1,216 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import socket
|
||||||
|
import getpass
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
REPO_URL = "https://github.com/Cian-H/My_NixOS_Config"
|
||||||
|
TARGET_DIR = os.path.expanduser("~/.config/nix")
|
||||||
|
|
||||||
|
|
||||||
|
def command_exists(cmd: str) -> bool:
|
||||||
|
"""Check if a command is available on the system."""
|
||||||
|
return shutil.which(cmd) is not None
|
||||||
|
|
||||||
|
|
||||||
|
def check_preconditions(target_dir: str):
|
||||||
|
"""Ensure the system is in a valid state to begin bootstrapping."""
|
||||||
|
if not command_exists("git"):
|
||||||
|
print(
|
||||||
|
"Error: 'git' is not installed. Please install git before bootstrapping.",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if os.path.exists(target_dir):
|
||||||
|
print(
|
||||||
|
f"Error: {target_dir} already exists. Aborting bootstrap.", file=sys.stderr
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def clone_repository(repo_url: str, target_dir: str):
|
||||||
|
"""Clone the configuration repository and enter the directory."""
|
||||||
|
print(f">> Cloning {repo_url} into {target_dir}...")
|
||||||
|
try:
|
||||||
|
subprocess.run(["git", "clone", "--recursive", repo_url, target_dir], check=True)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Error: Failed to clone repository.", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
os.chdir(target_dir)
|
||||||
|
|
||||||
|
|
||||||
|
def detect_nixos() -> bool:
|
||||||
|
"""Check if the current host system is NixOS."""
|
||||||
|
if os.path.exists("/etc/os-release"):
|
||||||
|
with open("/etc/os-release", "r") as f:
|
||||||
|
if "ID=nixos" in f.read():
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def has_config(sys_name: str, is_nixos: bool) -> bool:
|
||||||
|
"""Determine if system configuration directories exist for the given hostname."""
|
||||||
|
has_nixos_dir = os.path.isdir(f"nixos/{sys_name}")
|
||||||
|
has_hm_dir = os.path.isdir(f"home-manager/{sys_name}")
|
||||||
|
return (has_nixos_dir and has_hm_dir) if is_nixos else has_hm_dir
|
||||||
|
|
||||||
|
|
||||||
|
def get_available_systems() -> list:
|
||||||
|
"""Discover existing system configurations in the repository."""
|
||||||
|
opts = set()
|
||||||
|
if os.path.exists("nixos"):
|
||||||
|
opts.update([d for d in os.listdir("nixos") if os.path.isdir(f"nixos/{d}")])
|
||||||
|
if os.path.exists("home-manager"):
|
||||||
|
opts.update(
|
||||||
|
[
|
||||||
|
d
|
||||||
|
for d in os.listdir("home-manager")
|
||||||
|
if os.path.isdir(f"home-manager/{d}")
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Filter out base/core directories and hidden folders, then sort for consistent output
|
||||||
|
return sorted([o for o in opts if o not in ["core"] and not o.startswith(".")])
|
||||||
|
|
||||||
|
|
||||||
|
def setup_new_config(target_sys: str, target_dir: str, is_nixos: bool):
|
||||||
|
"""Create boilerplate directories for a missing system and open an editor."""
|
||||||
|
print(">> Creating directories...")
|
||||||
|
if is_nixos:
|
||||||
|
os.makedirs(f"nixos/{target_sys}", exist_ok=True)
|
||||||
|
os.makedirs(f"home-manager/{target_sys}", exist_ok=True)
|
||||||
|
|
||||||
|
if command_exists("yazi"):
|
||||||
|
print(">> Opening yazi. Please add your configs and exit yazi when finished.")
|
||||||
|
subprocess.run(["yazi", target_dir])
|
||||||
|
else:
|
||||||
|
print(
|
||||||
|
f">> Yazi not found. Please manually configure your files in {target_dir} in another terminal."
|
||||||
|
)
|
||||||
|
input("Press Enter when you have finished adding your configurations...")
|
||||||
|
|
||||||
|
|
||||||
|
def prompt_for_existing_config(current_sys: str, current_user: str) -> tuple[str, str]:
|
||||||
|
"""Prompt the user to select an existing configuration from the repo."""
|
||||||
|
opts = get_available_systems()
|
||||||
|
if not opts:
|
||||||
|
print(
|
||||||
|
"Error: No existing configurations found. Cannot proceed.", file=sys.stderr
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print("\nAvailable systems:")
|
||||||
|
for o in opts:
|
||||||
|
print(f" - {o}")
|
||||||
|
|
||||||
|
chosen_sys = input(f"\nEnter system to use [default: {current_sys}]: ").strip()
|
||||||
|
if chosen_sys:
|
||||||
|
if chosen_sys not in opts:
|
||||||
|
print(f"Error: '{chosen_sys}' is not a valid option.")
|
||||||
|
sys.exit(1)
|
||||||
|
target_sys = chosen_sys
|
||||||
|
else:
|
||||||
|
target_sys = current_sys
|
||||||
|
# Failsafe: if they press enter, but the default hostname isn't actually a valid config
|
||||||
|
if target_sys not in opts:
|
||||||
|
print(
|
||||||
|
f"Error: Default '{target_sys}' is not in available systems. You must type a valid option."
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
chosen_user = input(
|
||||||
|
f"Enter user configuration to use [default: {current_user}]: "
|
||||||
|
).strip()
|
||||||
|
target_user = chosen_user if chosen_user else current_user
|
||||||
|
|
||||||
|
return target_sys, target_user
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_configuration(
|
||||||
|
target_sys: str, target_user: str, target_dir: str, is_nixos: bool
|
||||||
|
) -> tuple[str, str]:
|
||||||
|
"""Ensure a valid configuration target exists, prompting the user for resolution if necessary."""
|
||||||
|
if has_config(target_sys, is_nixos):
|
||||||
|
return target_sys, target_user
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\n>> Configuration for system '{target_sys}' (user: '{target_user}') not found."
|
||||||
|
)
|
||||||
|
ans = (
|
||||||
|
input("Do you want to create the missing directories now? [y/N]: ")
|
||||||
|
.strip()
|
||||||
|
.lower()
|
||||||
|
)
|
||||||
|
|
||||||
|
if ans == "y":
|
||||||
|
setup_new_config(target_sys, target_dir, is_nixos)
|
||||||
|
return target_sys, target_user
|
||||||
|
|
||||||
|
ans = (
|
||||||
|
input("Do you want to switch to one of the existing configs instead? [y/N]: ")
|
||||||
|
.strip()
|
||||||
|
.lower()
|
||||||
|
)
|
||||||
|
if ans == "y":
|
||||||
|
return prompt_for_existing_config(target_sys, target_user)
|
||||||
|
|
||||||
|
print(
|
||||||
|
"Error: Cannot proceed without a valid configuration. Aborting.",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def execute_installation(target_sys: str, target_user: str, is_nixos: bool):
|
||||||
|
"""Execute the final NixOS or Home Manager commands to build the system."""
|
||||||
|
print(
|
||||||
|
f"\n>> Proceeding with installation for user '{target_user}' on system '{target_sys}'..."
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
if is_nixos:
|
||||||
|
print(
|
||||||
|
">> [NixOS detected] Performing full system and home-manager install..."
|
||||||
|
)
|
||||||
|
subprocess.run(
|
||||||
|
["sudo", "nixos-rebuild", "switch", "--flake", f".#{target_sys}"],
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
subprocess.run(
|
||||||
|
["home-manager", "switch", "--flake", f".#{target_user}@{target_sys}"],
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
print(">> [Non-NixOS detected] Performing home-manager install only...")
|
||||||
|
subprocess.run(
|
||||||
|
["home-manager", "switch", "--flake", f".#{target_user}@{target_sys}"],
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
print("\n>> Bootstrap complete! Welcome to your new environment.")
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"\nError: Command '{' '.join(e.cmd)}' failed with exit status {e.returncode}.", file=sys.stderr)
|
||||||
|
sys.exit(e.returncode)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Main orchestration loop."""
|
||||||
|
check_preconditions(TARGET_DIR)
|
||||||
|
clone_repository(REPO_URL, TARGET_DIR)
|
||||||
|
|
||||||
|
is_nixos = detect_nixos()
|
||||||
|
hostname = socket.gethostname()
|
||||||
|
username = getpass.getuser()
|
||||||
|
|
||||||
|
# The returned tuple contains the final resolved system/user strings
|
||||||
|
final_sys, final_user = resolve_configuration(
|
||||||
|
hostname, username, TARGET_DIR, is_nixos
|
||||||
|
)
|
||||||
|
|
||||||
|
execute_installation(final_sys, final_user, is_nixos)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Executable
+43
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import typer
|
||||||
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
|
import mimetypes
|
||||||
|
|
||||||
|
|
||||||
|
def is_text_file(filepath: str):
|
||||||
|
mime_type, _ = mimetypes.guess_type(filepath)
|
||||||
|
if mime_type:
|
||||||
|
return mime_type.startswith("text/")
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(filepath, "rb") as f:
|
||||||
|
chunk = f.read(1024)
|
||||||
|
if b"\0" in chunk:
|
||||||
|
return False # Null bytes usually mean binary
|
||||||
|
return True
|
||||||
|
except IsADirectoryError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
app = typer.Typer()
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def edit(target: Path = typer.Argument(..., help="File or directory to edit")):
|
||||||
|
if not target.exists():
|
||||||
|
subprocess.run(["nvim", str(target)])
|
||||||
|
return
|
||||||
|
|
||||||
|
if target.is_dir():
|
||||||
|
subprocess.run(["yazi", str(target)])
|
||||||
|
return
|
||||||
|
|
||||||
|
if is_text_file(str(target)):
|
||||||
|
subprocess.run(["nvim", str(target)])
|
||||||
|
else:
|
||||||
|
subprocess.run(["heh", str(target)])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app()
|
||||||
Executable
+50
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require '[babashka.cli :as cli]
|
||||||
|
'[babashka.fs :as fs]
|
||||||
|
'[babashka.process :refer [shell]]
|
||||||
|
'[clojure.string :as str])
|
||||||
|
|
||||||
|
(defn get-hostname []
|
||||||
|
(let [env-host (System/getenv "HOSTNAME")
|
||||||
|
etc-host (try (str/trim (slurp "/etc/hostname")) (catch Exception _ nil))
|
||||||
|
java-host (try (.getHostName (java.net.InetAddress/getLocalHost)) (catch Exception _ nil))]
|
||||||
|
(first (remove str/blank? [env-host etc-host java-host "default-system"]))))
|
||||||
|
|
||||||
|
(def cli-spec
|
||||||
|
{:spec {:home {:coerce :boolean :desc "Edit home-manager config instead of NixOS config"}
|
||||||
|
:sys {:desc "Specify system (defaults to current hostname)"}
|
||||||
|
:user {:default (System/getProperty "user.name")
|
||||||
|
:desc "Specify user (defaults to current user)"}
|
||||||
|
:update {:coerce :boolean :default true
|
||||||
|
:desc "Run auto-update after editing"}
|
||||||
|
:help {:alias :h :coerce :boolean :desc "Show this help message"}}})
|
||||||
|
|
||||||
|
(let [opts (cli/parse-opts *command-line-args* cli-spec)]
|
||||||
|
|
||||||
|
(when (:help opts)
|
||||||
|
(println "Usage: just packages [OPTIONS]")
|
||||||
|
(println (cli/format-opts cli-spec))
|
||||||
|
(System/exit 0))
|
||||||
|
|
||||||
|
(let [sys (let [s (:sys opts)]
|
||||||
|
(if (str/blank? s) (get-hostname) s))
|
||||||
|
target (if (:home opts)
|
||||||
|
(str "home-manager/" sys "/packages.nix")
|
||||||
|
(str "nixos/" sys "/packages.nix"))]
|
||||||
|
|
||||||
|
(if-not (fs/exists? target)
|
||||||
|
(do
|
||||||
|
(binding [*out* *err*]
|
||||||
|
(println (str ">> Error: Target file does not exist: " target))
|
||||||
|
(println ">> Please ensure this system profile has been bootstrapped or configured first."))
|
||||||
|
(System/exit 1))
|
||||||
|
(do
|
||||||
|
(println ">> Editing" target "...")
|
||||||
|
(shell "just" "edit" target)
|
||||||
|
|
||||||
|
(if (:update opts)
|
||||||
|
(do
|
||||||
|
(println ">> Applying updates...")
|
||||||
|
(shell "just" "quick-update"))
|
||||||
|
(println ">> Skipping update (no-update provided)."))))))
|
||||||
Reference in New Issue
Block a user