Compare commits

...

208 Commits

Author SHA1 Message Date
58d6fba6cb added cyberdream theme 2026-10-07 20:17:17 +01:00
450f48bc0a adding vim or something 2026-09-29 13:57:38 +01:00
b708a82046 updated quickshell 2026-09-26 17:37:44 +01:00
a3b6475c0c updated gotify desktop 2026-09-26 17:25:40 +01:00
35fbb13b3d permit root login for ssh 2026-09-26 17:25:23 +01:00
5e9fb94bcb removed useless school module 2026-09-25 21:13:30 +01:00
ff34c0d3c1 removed deprecated waybar to stop eval warning 2026-09-25 21:01:06 +01:00
38ffd22819 fixed gotify desktop finally 2026-09-25 21:00:34 +01:00
8b33848660 adding sops to fix gotify-desktop after long last 2026-09-25 20:48:13 +01:00
e3fc39cf43 fixed davinci for hopefully the last time 2026-09-25 20:06:36 +01:00
9a2161d8e2 added some missing groups and fixed davinci (i can edit the damn video) 2026-09-25 15:45:13 +01:00
75de4af64b some bullshit to make hyprland work that didnt work, rolling back for now 2026-09-24 22:00:49 +01:00
7208f789e9 fixed new mouse behavior 2026-09-19 14:18:17 +01:00
c77103a09a updated hyprland 2026-09-19 13:38:09 +01:00
ddc2abab52 updated hyprland for wshowkeys 2026-09-18 16:55:06 +01:00
8e8061a311 updated hyprland 2026-09-17 17:26:24 +01:00
d5f3518ef6 deprecated and removed i3 2026-09-17 17:14:10 +01:00
01456a3d4d deprecated waybar 2026-09-17 17:14:04 +01:00
3f606df726 updated flake 2026-09-17 17:13:59 +01:00
2f125855f4 changed to alt in i3 for a xephyr experiment 2026-09-17 17:07:39 +01:00
a9cd267bb9 added g++ to distcc to inhibit warnings 2026-09-17 17:07:28 +01:00
c16c8e4726 added teams for school 2026-09-07 13:51:55 +01:00
a7b6f63509 distcc feature added to hackstation 2026-09-05 19:18:47 +01:00
a2959bda31 added unstablePkgs module option 2026-09-05 19:18:29 +01:00
406cfcdcca enabled networkManager applet when on tablet to log into school wifi 2026-09-04 08:13:22 +01:00
daf346127a changed enablePlugins option to universal tabletSupport option because it makes more sense 2026-09-04 08:13:05 +01:00
4caac02796 updated hyprland and quickshell for new touchscreen features 2026-09-02 19:24:52 +01:00
83b3cee120 added wvkbd according to tablet mode toggle 2026-08-31 19:55:28 +01:00
c98e633178 re-added the repo-checker thingy 2026-08-27 14:23:02 +01:00
8dc79f60ee formatted zsh and replaced manual flakeLocation with universal 2026-08-27 14:21:49 +01:00
03f1d74812 cleaned up core modules and added universal flakeLocation argument 2026-08-27 14:21:11 +01:00
06f2e248a8 updated hyprland and quickshell for tablet mode 2026-08-26 19:36:50 +01:00
b5c4879bb4 updated quickshell for tablet mode 2026-08-26 19:05:58 +01:00
4ba613b95f added a thinkpad fan controller module (because that isnt inbuilt???) 2026-08-26 18:43:18 +01:00
ba688432e6 moved the ssh indicator to the leftmost spot 2026-08-26 17:54:49 +01:00
676fdbea0e made all ssh shells show hostname instead 2026-08-26 14:24:30 +01:00
85d4610988 plugins loading in hyprland according to toggle 2026-08-25 20:19:18 +01:00
1d28a7b7ef fixed my awful nix syntax errors 2026-08-25 19:24:16 +01:00
036d16cf05 removed non-functional hyprland module in favour of a symlinked file 2026-08-25 19:16:24 +01:00
ac7a0adbf2 updated hyprland for hyprgrass null safety and installed prismlauncher 2026-08-24 21:12:54 +01:00
65dcf59eeb fixed hyprgrass install and removed hyprspace (incompatible with hyprland 0.56) 2026-08-24 21:12:12 +01:00
9c28a8b6db replaced any-nix-shell with newer nix-your-shell 2026-08-24 14:19:06 +01:00
6a3839a38e altered woomer to remove xorg, waiting for pull upstream 2026-08-24 13:53:28 +01:00
54ee803c9c removed weylus feature, moved back to main for wshowkeys, and updated flake 2026-08-24 13:41:39 +01:00
38bc8a1c20 updated hyprland and quickshell 2026-08-24 13:33:42 +01:00
9748ccaa0c made togglable plugins option for mobile03 2026-08-24 13:21:22 +01:00
4476a7f809 added networkmanager group to user01 2026-08-23 10:16:30 +01:00
7be136dfe8 updated hyprland for hopefully the last time 2026-08-23 10:13:39 +01:00
eeb251585d updated hyprland again because I forgot something 2026-08-23 09:57:27 +01:00
f6321ffd93 updated hyprland to add support for mobile03 2026-08-23 09:55:24 +01:00
48606f4977 added mobile03 (just a copy of mobile02) 2026-08-22 20:10:56 +01:00
88c38b76b8 added user to plugdev so they can use networkmanager 2026-08-22 20:10:40 +01:00
6519bb657a made the readme better 2026-08-20 14:39:31 +01:00
6b396d8bb9 added more wallpapers and re-enabled wide-lines for mobile02 2026-08-20 14:31:49 +01:00
f111183f73 renamed the images so that the cache invalidates and the images are correct 2026-08-20 14:31:02 +01:00
6a43247c72 added newline between images for formatting 2026-08-20 14:24:42 +01:00
42ffb053b3 fixed readme links and added images 2026-08-20 14:23:18 +01:00
67c6eeb44a updated flake again lol 2026-08-19 16:27:06 +01:00
e808447b4f updated hyprland and quickshell, removed wlogout from hyprland tree 2026-08-19 10:51:12 +01:00
0c414948a5 updated flake 2026-08-19 10:48:47 +01:00
1e2888851e fixed hyprlock import stuff 2026-08-18 11:43:34 +01:00
a67a00725c hyprlock feature 2026-08-18 11:38:13 +01:00
15967f2fa1 fixed intel drivers according to wiki 2026-08-17 21:06:49 +01:00
fe71483c3d fixed weird jack incompatibility and added some more synths 2026-08-16 16:59:13 +01:00
def20c0070 removed weird merge artefact 2026-08-16 16:01:20 +01:00
b39108df2c wanted to make some music idk bro 2026-08-16 15:54:41 +01:00
e4fe282ffd added a tldr to the CONTRIBUTING.md guidelines 2026-08-16 12:13:55 +01:00
f76234271a updated hyprland because of keybind issues 2026-08-16 12:01:00 +01:00
546bf20a70 updated nvim and changed the name of the hyprland input 2026-08-16 10:59:10 +01:00
6ec6899793 added CONTRIBUTING.md 2026-08-16 10:57:59 +01:00
c0a5c4312f added prettierrc and formatted readme 2026-08-16 10:57:52 +01:00
9764a025a9 Merge branch 'dendritic' 2026-08-15 20:14:24 +01:00
25c6507c3e updated quickshell 2026-08-15 20:12:58 +01:00
b33c816191 updated hyprland and quickshell, will deprecate waybar shortly 2026-08-10 20:46:39 +01:00
f2c68c8511 updated nvim and quickshell 2026-08-10 16:59:46 +01:00
06848de32a tailscale feature added to desktop 2026-08-10 12:11:03 +01:00
29413b1f67 fixed upower quickshell thing 2026-08-10 12:10:56 +01:00
bfeeacc434 moved upower to dedicated module 2026-08-07 19:04:33 +01:00
749ee86763 removed useless inputs from amddrivers 2026-08-07 19:04:19 +01:00
e56b948f91 updated nvim 2026-08-07 16:42:48 +01:00
c0da93fe55 enabled upower for quickshell 2026-08-05 17:12:49 +01:00
9b931a6284 updated nvim 2026-08-05 17:06:04 +01:00
f16c1137f9 disabled pixel scroll on kitty because who tf needs that 2026-08-05 16:57:16 +01:00
eb7217973d updated hyprland for new binds 2026-08-04 18:12:58 +01:00
d9bbfff120 fixed i3 2026-08-01 20:47:08 +01:00
21fe0c40e9 i3 feature 2026-08-01 20:21:23 +01:00
7be2e897d4 made hyprland default session for display manager 2026-08-01 20:20:13 +01:00
deddffad50 changed wshowkeys nixpkgs 2026-07-31 20:27:59 +01:00
00f6800290 added mpv to desktop 2026-07-30 19:38:12 +01:00
56aed1cf2d trying to fix davinci recording 2026-07-30 19:37:52 +01:00
88266b040f added server02 hostname block to ohmyposh 2026-07-29 17:46:43 +01:00
5f7fc8ea05 added warning for flakeLocation being null instead of an assert 2026-07-29 17:26:14 +01:00
3a634375a0 updated quickshell 2026-07-29 17:16:49 +01:00
7a3d2fee77 removed weylus temporarily 2026-07-28 19:59:10 +01:00
d4db1e7f09 updated flake and removed now redundant hyprland input 2026-07-28 19:59:10 +01:00
33702f4552 added docker and tor 2026-07-28 19:21:53 +01:00
4d9e050344 added user01 as a nix trusted user for devenv 2026-07-28 19:21:43 +01:00
a938343f87 devenv support (zsh feature) 2026-07-28 19:21:28 +01:00
637e665581 weylus feature 2026-07-22 13:35:09 +01:00
0d35a34e9b added weylus 2026-07-17 21:55:28 +01:00
9104f3b5af reformat and added vinix and nrs functions 2026-07-15 17:47:26 +01:00
bbc74a9614 added README 2026-07-13 13:25:19 +01:00
bd5fdfb8f3 fixed hyprland module root assignment and overriding 2026-07-13 13:25:12 +01:00
458ff46192 added nix-ld to hackstation 2026-07-13 12:18:31 +01:00
44b51bf454 fixed hyprland config getting garbage collected 2026-07-13 12:18:22 +01:00
9d20805a2b nix-ld feature 2026-07-13 12:17:52 +01:00
fb74703c0d formatting and removing useless parameters 2026-07-12 17:22:49 +01:00
f5664dd863 enabled wake on lan 2026-07-12 14:08:11 +01:00
0920cf080d fixed wshowkeys setuid problems 2026-07-11 20:30:07 +01:00
0c8cd3dd3d added much needed music to dev attr 2026-07-11 16:35:07 +01:00
3601a4a53a made otter look a bit nicer 2026-07-11 16:35:07 +01:00
a865a34754 fixed otter launcher and removed chafa dependancy 2026-07-11 15:55:20 +01:00
f41b716d95 fixed kitty font mismatch 2026-07-11 15:00:22 +01:00
72a91337ee fixed otter launcher somewhat 2026-07-11 15:00:13 +01:00
1910db8bd2 updated flake and decoupled useless runtimePackages 2026-07-11 14:54:14 +01:00
599f44a5a9 removed updated flake 2026-07-11 13:04:43 +01:00
896db79184 updated flake 2026-07-11 13:01:13 +01:00
e77cb49ffc adding symlink farm for hyprland launching 2026-07-11 12:40:46 +01:00
1a70f20213 fixed inconsistent zsh behaviour 2026-07-11 11:19:54 +01:00
921edd90e3 updated hyprland flake 2026-07-11 10:43:26 +01:00
1ffd4c02f4 added correct drivers to hackstation 2026-07-11 10:42:28 +01:00
12776bf609 updated flake 2026-07-11 09:53:42 +01:00
0b58bfecfc flake.lock: Update
Flake lock file updates:

• Updated input 'hyprland':
    'git+https://git.voidarc.co.uk/voidarc/hypr?ref=refs/heads/main&rev=bdd6ec3efa05c1130002808d4c2c4552bb20587a' (2026-07-04)
  → 'git+https://git.voidarc.co.uk/voidarc/hypr?ref=refs/heads/main&rev=25fcd16d4d4836e063e2198102ddfba38de43100' (2026-07-10)
2026-07-11 09:52:56 +01:00
cc1d60ce13 added missing fzf search 2026-07-10 21:52:00 +01:00
904b387fa7 fixed weird chafa behaviour 2026-07-10 21:51:49 +01:00
460c6daf76 added missing settings 2026-07-10 21:51:41 +01:00
7455cc5c0f otter launcher 2026-07-10 19:55:26 +01:00
19c22f9386 added missing alias 2026-07-10 17:39:23 +01:00
b0f1bc9ee0 added unfree pkgs module arg and fixed steam 2026-07-10 17:34:43 +01:00
9dab291884 added all the things to hackstation 2026-07-10 17:14:33 +01:00
5c9c915457 i cant spell package apparently 2026-07-10 17:14:21 +01:00
839e1fd5f5 fixed weird pre-defined module behaviour 2026-07-10 17:14:07 +01:00
7aa01ae0dd fixed nvim module 2026-07-10 17:13:55 +01:00
7e788e5c8e added youtube attribute 2026-07-07 17:27:58 +01:00
11133b4bb0 wshowkeys feature 2026-07-07 17:26:19 +01:00
2d158c556f made desktop consistent 2026-07-07 17:26:08 +01:00
40862064c9 woomer feature 2026-07-07 17:25:58 +01:00
651bd62c00 obs studio feature 2026-07-07 17:25:31 +01:00
b149325e23 made dev and gaming attributes consistent 2026-07-07 17:25:24 +01:00
a67e855aca bottles attribute 2026-07-07 17:25:07 +01:00
b615ba2ff1 renamed systemTheme module to be consistent with naming structure 2026-07-07 16:57:37 +01:00
c8a12d7988 refactored to make wpaperd a seperate feature, renamed hyprland feature 2026-07-07 16:57:17 +01:00
0e57b9d04e omnisearch feature 2026-07-07 16:55:43 +01:00
1972d8ec31 wlogout temp feature (will be removed with quickshell update) 2026-07-07 16:45:52 +01:00
4a2730ed44 way-edges feature 2026-07-07 16:45:09 +01:00
a3ad40702b removed redundant unbound feature 2026-07-07 16:37:05 +01:00
624d204412 quickshell feature 2026-07-07 16:24:32 +01:00
47296ec554 waybar feature 2026-07-07 16:24:03 +01:00
c1ce520858 added quickshell 2026-07-07 16:14:08 +01:00
f9b5c03e87 undid all of the wrapper nonsense 2026-07-07 16:11:55 +01:00
86188bc3d8 removed useless module 2026-07-07 14:32:08 +01:00
ee4ce13a10 added davinci module 2026-07-07 13:53:14 +01:00
d18e1476dd realised how self' is supposed to work and removed all stdenv bullshit 2026-07-07 13:53:09 +01:00
dd8369d01e enabled dconf explicitly and added xfconf for compat 2026-07-07 13:52:36 +01:00
f9ab6fa233 moved firewall to default network module 2026-07-07 13:52:23 +01:00
47228d878c ssh, avahi and stateversion added to core 2026-07-07 13:52:10 +01:00
80627250ec enabled gpg for git 2026-07-07 13:51:51 +01:00
3a5d414b43 development and gaming attributes 2026-07-07 13:51:40 +01:00
52e9f0a94c renamed gtk to more apth theming system module 2026-07-07 11:39:39 +01:00
d61fb98c9f git feature 2026-07-07 11:38:21 +01:00
02b09173b8 added gsettings that might work this time 2026-07-07 11:38:14 +01:00
a47e0d751a added playerctl to audio module 2026-07-07 11:38:05 +01:00
da03a794a4 added core packages 2026-07-07 11:37:57 +01:00
275a32523a added mesa and some other stuff to drivers 2026-07-07 11:37:52 +01:00
22627b61ec lazygit feature 2026-07-06 20:46:16 +01:00
901ce4f01f added missing packages to otter launcher 2026-07-06 20:30:05 +01:00
9651e02cbe added system theme to desktop aspect 2026-07-06 20:03:07 +01:00
a440aab9f1 renamed network so that infinite recursion doesnt happen 2026-07-06 20:01:22 +01:00
b8ac7247a5 fixed gtk theming to use gsettings 2026-07-06 20:01:01 +01:00
196170c8df added network to desktop 2026-07-06 17:35:28 +01:00
17c9f87218 added gtk and hyprlock to hyprland 2026-07-06 17:34:39 +01:00
246745f2f7 added unbound vpn 2026-07-06 17:33:04 +01:00
60a5ef23ec added gtk theming 2026-07-06 17:32:52 +01:00
2d4df68db4 added a template file i can copy 2026-07-06 17:32:35 +01:00
5cc1835f21 updated flake 2026-07-06 17:02:30 +01:00
59d2a8acfb added network system module 2026-07-06 17:02:20 +01:00
3bb63059fa added drivers for systems 2026-07-06 17:02:12 +01:00
1e9783a97d steam feature 2026-07-06 17:02:02 +01:00
1f9820e7b7 added otter module 2026-07-06 17:01:53 +01:00
32db47b96a kitty variable name change 2026-07-06 17:00:18 +01:00
bdca2fdc0f added git-secret and gotify-desktop feature 2026-07-06 17:00:03 +01:00
0ba9ee4bad added desktop system preset 2026-07-04 18:26:23 +01:00
c5166d8c07 added sddm with autologin (only one needed) 2026-07-04 18:26:15 +01:00
bdb76684d9 added needed services to hyprland 2026-07-04 18:26:05 +01:00
05b0864145 restructured core modules 2026-07-04 18:25:42 +01:00
2d9e205897 moved audio module 2026-07-04 18:25:25 +01:00
7e753132ea renamed zsh and format 2026-07-04 18:25:18 +01:00
5d7739d0f6 fixed otter having a weird module 2026-07-04 18:25:07 +01:00
0f1b783aa3 added mumble 2026-07-04 18:24:46 +01:00
b4e0d9f475 updated hyprland 2026-07-04 16:43:50 +01:00
59575477d5 fixed kitty and added to core 2026-07-04 16:43:46 +01:00
f3e93f9ae7 fixed carapace 2026-07-04 16:43:37 +01:00
a02f96f6ca fixed zsh package nonsense (i hate carapace) 2026-07-04 16:11:10 +01:00
d28858fb45 added otter launcher 2026-07-04 13:41:07 +01:00
06d93d6e4f added wpaperd and started on otter 2026-07-04 13:30:24 +01:00
cc155d4252 nvim added (properly this time) 2026-07-04 12:36:13 +01:00
fd62c17426 updated nvim input 2026-07-03 21:38:23 +01:00
75f0e2993f kitty added 2026-07-03 17:24:58 +01:00
90c612bb57 enabled git-secret and gnupg 2026-07-02 08:55:28 +01:00
36f5d5cdd7 made aliases proper 2026-07-01 21:19:15 +01:00
0630db91fb fixed zsh HOLY SHIT THIS IS THE COOLEST THING EVER 2026-07-01 21:04:37 +01:00
13119c8f7b maybe zsh works 2026-07-01 20:10:13 +01:00
b4350f2dae zsh experimenting 2026-07-01 20:04:02 +01:00
3609e42d8f hackstation config 2026-07-01 19:37:52 +01:00
8b04d1763e added user config 2026-07-01 19:30:05 +01:00
4fd7db083b added first modules 2026-07-01 19:19:40 +01:00
3644a0f265 fresh 2026-07-01 19:07:57 +01:00
f08555296c added rocm drivers 2026-06-30 20:33:44 +01:00
120 changed files with 3925 additions and 1131 deletions

8
.gitignore vendored
View File

@@ -1,2 +1,8 @@
.session
modules/chataigne/squashfs-root
/nixos.qcow2
/result
/HACKSTATION.qcow2
/result-man
.gitsecret/keys/random_seed
!*.secret
modules/features/gotify-desktop/gotify-key

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "modules/features/nvim/config"]
path = modules/features/nvim/config
url = https://git.voidarc.co.uk/voidarc/nvim

BIN
.gitsecret/keys/pubring.kbx Normal file

Binary file not shown.

Binary file not shown.

BIN
.gitsecret/keys/trustdb.gpg Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
modules/features/gotify-desktop/gotify-key:f6129ad401b60d5a491d582169088600bb58a537d232b93c22923aede129d5cc

8
.prettierrc.json Normal file
View File

@@ -0,0 +1,8 @@
{
"tabWidth": 2,
"printWidth": 90,
"useTabs": false,
"proseWrap": "always",
"endOfLine": "lf",
"embeddedLanguageFormatting": "auto"
}

251
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,251 @@
# CONTRIBUTING
## Tldr
**Do's**
- Be concise
- Follow the [Formatting Rules](#formatting-rules) to the best of your ability
- Segment larger changes into managable, reviewable commits
- Leave a trail of your development so I can tell you put some effort in (doesnt really
apply to smaller commits)
- Write your own code
- Leave some way of crediting your work
- Disclose the capacity in which you used AI. Most of the time, anything more than making
examples or helping you understand the codebase will be disallowed. As little AI code
should make it to production as possible
**Dont's**
- Report upstream issues to me (ie an issue with the app itself, not my config)
- Make major structural changes
- Submit chore commits such as updating the flake, I can do that myself
- Add new hosts for no reason, make your own flake and import the modules you want for
your host
- Majorly change existing hosts for your own preference
- Ask AI to fix your issues and expect me to merge changes
- Delete existing modules. Executive decisions like that will be made at my disgression,
and will be done as non-destructively as possible, such as moving those modules to a
"deprecated" branch in the future.
## General format
All emails regarding this repo (or another) should have a subject prepended with the
following:
```text
[GIT] [voidarc/nixos] (request type)
```
The content of the second set of brackets should be replaced with the specific submodule
or repo that is being referred to. For example, in the case of a quickshell bug, it should
contain `voidarc/quickshell`.
In general, for most requests, I also implore you to include a github username (or
equivalent, codeberg, gitlab, etc.) so that I have a frame of reference for you as a
person, and also so that you can be credited in any resulting commits. Depending on
scenario, this requirement can be waived, or substituted for a reddit account or
something.
The third set of brackets pertains to the subject proper, and should only reasonably
contain `issue`, `patch` or `feature`. If you believe that your request does not fit into
any of those categories, then feel free to do whatever you want within reason.
## Issues
Issues are restricted to bugs or otherwise not fixed problems in the code. If it is an
upstream bug, ie one not caused by my specific config, please don't send me a complaint
about it, refer to the source app. The subject for an issue should be formatted as such:
```Text
(prefix) (module type) (specific module) - (description of issue)
```
The prefix shoud be formatted as above. In the case of an issue pertaining to another
repo, the module type and module name may be omitted, unless it is an issue with the
dendritic module implementation, in which case the repo in the subject should be this one.
The module type should match the repo's folder structure, being one of `feature`,
`system`, `attr/attribute` or `host`. Self explanitory. Doesn't have to be an exact match.
The specific module should be the name of the module itself, not just the directory that
contains it, due to the fact that some directories and files contain multiple modules. In
the case of a file containing both a package and a module, favour the module that
implements the package, and not the package itself (`self.nixosModules` rather than
`self'.packages`).
The description should follow standard conventions, as you would report on other
platforms. Don't make it stupidly long, common sense required.
The body of the email should be reminiscent of a github issue, and contain the following
items in roughly the presented order:
- Clear description of the issue (and why it's an issue in the first place, and not
personal preference)
- Step by step instructions on how to replicate the given issue
- Step by step instructions detailing what you believe the behaviour should be
- Any attempts to fix the issue, or references to suspected code that may be causing the
issue
If you have attempted to fix the issue, or altered the code, please refer to the next
section
## Patches / Contributions (Pull requests)
Patches are for altered code that you would like me to review and possibly add to the
codebase. Most of the time, these should be for issues that you have encountered using the
repo, not new features entirely. If a patch doesn't fit an issue, is mostly or fully AI
generated, or otherwise doesnt fit the repo, it will be rejected.
The format here is similar, but with a few key differences. The type of request should
obviously be patch, and the rest should be identical to the previous type, containing
module type, name, and a short description of the issue.
The body should also follow similar beats, having a breakdown of the issue and detailing
the intended behaviour. Beyond the detailing portion, there are some other specific things
that are required for issues in particular.
- A description of whatever alterations have been made to the code
- Some form of username so that, in the event of a merge, you can be credited properly
- A disclosure of how much or little AI was used in the creation of the patch. For
completeness, even if no AI is used, please include "No AI was used" anyway, it is not
implied.
A git patch file should be attatched to the email, not a link to a github repo or
something else. Any "patch" email with no attatchments will probably not be looked at any
further than the issue section. For patches, please refer to the
[Formatting Rules](#formatting-rules)
Both issues and patches are on a first come first serve basis. Because there is no public
forum (I'm sure as hell not maintaining one), if someone submits an issue or patch, even
if someone else independantly discovered the bug, the first person will most likely be
credited for that issue.
If you have previously opened an issue, and wish to make a patch for the same issue, reply
to the initial issue email, and prefix the subject with `PATCH:` instead of the usual
`RE:` or whatever your email client chooses to prepend. The rest of the subject should
remain the same. The email should then contain the patch-specific sections, found above.
Don't bother re-iterating the issue.
## Feature Requests
Feature requests are for anything that doesn't already exist or doesnt otherwise fall into
the previous categories. These are more freeform, and could come in the form of a useful
app, a better way of managing something, or a better replacement for something that is
already in the repo. Most importantly, this is NOT somewhere to shill an app you
vibe-coded. Any AI generated apps will be rejected out of principle.
Headers should follow this structure, but, again, this is lenient:
```text
(prefix) - (Feature type) - (App name): (description)
```
The feature type, as before, should be one of the given folders in the repo. Generally,
this will be a `feature` for a new app, but could be `system` for a new driver or
`attribute` for a new collection of packages. If it is more general than any of those
categories, or smaller in scope than an entire feature, use the feature type `other`, and
detail what you are requesting (other should be used if you are just requesting a singular
package be added to the system, for example).
Instead of following a fixed structure for the body, it is up to you to make a case for
whatever you are suggesting. Whatever that entails is up to you. It could be use cases, it
could be reasons it is better than whatever I am using. Be as verbose or as minimal as you
wish, but keep in mind that the better your argument is, the more likely I am to accept
your contribution. Again, if you wish, you can leave a username so that you can be
correctly credited if I decide to include whatever you suggested.
If you are suggesting a new feature, app or otherwise, you may also choose to make a basic
or full module implementing that feature, and then attach that to the email in the form of
a patch. Refer to the [Formatting Rules](#formatting-rules) for further instruction on how
to write your code.
Please also leave references for whatever it is you're suggesting, not just the name of
the app. This could come in the form of documentation, a homepage, or the link for its
github. In general, if an app has none of these things, or is closed source in any
capacity, it will not be accepted.
## Formatting rules
Formatting in this repo should attempt to be standard to whatever I am using. For ease of
use, either refer to or use my nvim config (`#nvim` output for this repo, refer to the
README for how to run it). This prevents ugly git histories with commits specifically for
formatting etc.
### General rules
When submitting a patch, there should be no merge conflicts with the current HEAD at the
time of creation. It is a good rule of thumb to pull from remote before making a patch,
incase behaviour changes.
If there are commits pushed between the time you send a patch and the time it is reviewed,
any resulting merge conflicts are not your fault, and therefore will not be treated as
such. Don't resubmit the same patch because there are new commits on remote, when patches
are reviewed they are inserted at the point at which they were created, not on top of
newer commits.
#### Branches
All patches should be mergable to the main branch, ie not have a patch for the `feature-x`
branch or some nonsense. I do not have your git history, and therefore don't have whatever
branch you created on my machine. In general, most changes should be restricted to one
commit, so that crediting is easy.
If a change is more than one or two commits, make a new branch, make the changes that you
want, then merge to the latest head before submitting a patch. When merging back to main,
please use a merge commit instead of fast forwarding or clobbering the branch. This makes
it easy to see who made what changes in the git history, and keeps blame easy to read.
This merge commit will be where your credit goes. If you submit a patch that contains a
load of commits on the main branch, the chances I accept the patch are very low.
### Code
There are many types of code in this repo, so if there is any confusion, either refer to
the config that I am using in nvim, or send me an email asking me how to handle it.
#### Nix
For starters, all nix code should be formatted with
[Alejandra](https://github.com/kamadorueda/alejandra). If you choose to format your code
with nix-fmt or something else, chances are I won't refuse it, but I will overwrite your
commits with a formatted version. To format the entire repo properly, run the following
command:
```bash
nix-shell -p alejandra --run "alejandra ."
```
This will recursively check and format all `.nix` files in the repo, which is what I want.
As a secondary requirement, try to follow the already set out conventions that are on
display in this repo, as well as the conventions of dendritic nix. A few examples:
- All top level objects should be merged into one unless there is a good reason for it
- The first item in a module should be the module definition (`flake.nixosModules.xyz`)
- All modules should be portable unless there is a good reason for it
- Modules should reference eachother through `self.nixosModules` instead of relative
paths, which should be avoided in most scenarios
- In general, if a package is available in nixpkgs, an input need not be added. This rule
differs case-by-case due to versioning differences.
#### Markdown
All markdown files should be formatted using prettier, with the settings provided in this
repo. For reference, the rules are:
- 90 characters maximum, excluding code blocks
- word wrapping
- tab width of 2, as well as replacing spaces with tabs
#### Other languages
For one-off config languages (think `kitty.conf`), no formatting is needed. Whitespace can
be added at the programmer's disgression.
For standard structured languages, such as json, yaml or toml, if there is an available
prettier formatter, then it should be used. In general, tabwidth should be 2 and spaces
should be used across the board. Don't use some esoteric formatter just to be special.
For actual programming languages, like qml or lua, either use the provided formatter, such
as `qmlformat`, with the settings configured, or refer to my nvim config (in this case I
use `stylua` with the default settings)

163
README.md Normal file
View File

@@ -0,0 +1,163 @@
# The Void
_An opinionated dendritic nix configuration_
## Screenshots
![Picture of desktop with fastfetch, nemo, and otter-launcher](assets/desktop-1-v2.png)
![Picture of Neovim open, editing the hyprland repo](assets/desktop-2-v2.png)
## Get Started
No cloning required
```bash
# Run any app (replace appname with the one you want)
nix run "git+https://git.voidarc.co.uk/voidarc/nixos.git#appname"
# Build configuration (HACKSTATION or mobile02)
sudo nixos-rebuild switch --impure --flake "git+https://git.voidarc.co.uk/voidarc/nixos.git#mobile02"
```
[More Information on Configs](#nixos-configurations)
[More Information on Binaries](#binaries)
## The Concept
I have been trying to get consistent, across device experiences from the second that I
started using linux. I tried my best with arch, but I foolishly believed that just
remembering what packages I installed would be enough. Then I started managing my dotfiles
with GNU stow, but that only allowed for a single host per repo. I moved over to doot, and
simultaneously nixos.
I believed a dotfiles manager was my endgame. The final evolution, but it was far from
ideal. I had to manage a mess of dotfiles, submodules and nix packages that were
completely uncoupled from the apps that used them. Hyprland just assumed that I had all of
my apps installed, assumed that otter-launcher's config existed. Just by forgetting an app
or a toml file, I had the potential to brick my entire setup.
This is no longer the case.
The solution is similar to that of safely typed languages, like rust. Rust, instead of
having optional parameters like typescript, requires that a variable be passed to a
function, regardless of whether it contains anything. This leads to what is essentially a
fixed dependancy tree, where there are no points of failiure, only allowing for logic
errors and such. The same methodology can be applied to nix, using flake parts and wrapper
scripts.
Instead of defining the packages beside the app, and its config, you can use the config to
define the required binaries. By wrapping a config that contains a nix variable, ie a
binary, that binary is intrinsically linked to that config, and will therefore always be
installed. No more dependancy issues, and because the configs are defined within nix too,
no more potential for missing config files. Dotfile managers are no more, long live
dotfile managers. Any app with a `--config` flag can now be fully versioned and self
contained within one repo, config and all, accessible on any machine with nix.
One command for a truly reproducible, fully contained, configured system. This is the
endgame.
### Mandatory thing on AI
I am not completely against AI. However, asking an agent to write a load of code and then
posting it to reddit as if you made it yourself is disingenuous and (in my opinion) at
least slightly morally incorrect. Many a time I have seen a cool project on a subreddit
just for it to turn out to be ai generated garbage that I refuse to use out of principle.
I would go out on a limb and say that 99% of this codebase was written with no AI
assistance. Every config, every module, every obscure fix for a bug that only exists
because I'm using a dendritic pattern instead of being normal was programmed by hand by a
real human (yours truly). I'm not saying I had no assistance at all, there are sections
that are verbatim copied from the wiki of whatever app or language that I was using, but
by and large, no AI code has made it into this repo.
There may be commits somewhere saying that opencode refactored something, or that it
solved some obscure bug I was having, but after having those changes implemented for me, I
took it upon myself to understand what actually happened, in order to make maintaining
this config as easy as possible in the future.
This repo is not temporary. I daily drive this, and I intend to for many years to come.
Going forward, I will keep to the same standard of only using AI as a last resort, and
when needs must, only implementing and commiting changes that I fully understand and
could've eventually come to myself. Sometimes, at the end of a long coding session, a man
gets lazy. I could spend another 45 minutes fixing some quickshell update order bug, or I
could get deepseek to do it. In the end, it was a 5 line fix that, in hindsight, was
pretty obvious (lol).
## Usage
Usage is similar to any other flake, with everything in the module directory being an
output.
The folder structure is simply defined:
```
modules/
|- features/ - all available apps, every subfolder contains a seperate wrapped binary
|- attrs/ - attributes composed of other modules, no new features defined
|- system/ - basic system modules, no binaries. Should not be run standalone. (Think network and audio config)
|- hosts/ - available presets for machines. Output names match subfolder names, eg #HACKSTATION, and hostnames
```
### Nixos Configurations
Due to the host module referencing `/etc/nixos/hardware-configuration.nix`, so that it is
seperated from the repo, all rebuild commands will need `--impure`, unless you copy your
configuration into the repo.
HACKSTATION contains all features available (near enough), with mobile02 being a lighter
version of the system, looking the same visually, but with less bloat, only really having
firefox and a terminal.
It is recommended to clone the repo beforehand, but the system can be built directly from
remote. When cloning the repo, in order to properly evaluate the `vinix` and `nrs` shell
aliases, the config should be built from the directory you cloned it to, not from another
directory. When building from remote, or in any other scenario in which the `$PWD`
environment variable is not available, the zsh module will throw and evaluation warning,
but the build will not be hindered.
```bash
# The following commands will only work if your hostname is already
# HACKSTATION or mobile02, if it is not, see next code block
# Local Clone, . is the directory containing flake.nix
sudo nixos-rebuild switch --impure --flake .
# Build from remote
sudo nixos-rebuild switch --impure --flake "git+https://git.voidarc.co.uk/voidarc/nixos.git"
```
Both of these commands can be appended with a desired hostname in order to build that
configuration.
```bash
# Example of building mobile02 from a local repo
sudo nixos-rebuild switch --impure --flake .#mobile02
```
There is no default output, so if the current hostname doesn't match a host, you will get
an error. Building this config should be non destructive to any existing dotfiles, but
will remove all users (not home directories) from the system other than `user01`, who's
default password is `qwer`. No, that isn't my usual password.
### Binaries
Any binary can be run with the same base command:
```bash
nix run "git+https://git.voidarc.co.uk/voidarc/nixos.git#appname"
```
`appname` can be substituted for the name of any folder in the `modules/features` dir, ie
`kitty` or `otter-launcher`. Most if not all modules in a subdirectory will have a module
name corresponding to that directory. This only applies for `default.nix` files, so files
that have different names are not expected to follow this convention, even if there is not
a `default.nix` in that directory.
## Issues and contributing
Because this is a private git server, there is no inline way to submit issues,
contributions, or feature ideas. If you should wish, you may send such requests to
<admin@voidarc.co.uk>, with the format found in [CONTRIBUTING.md]( CONTRIBUTING.md ). Failure to follow the
format found there will most likely result in your email being ignored.

BIN
assets/desktop-1-v2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
assets/desktop-2-v2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@@ -1,332 +0,0 @@
{
config,
lib,
pkgs,
inputs,
...
}: {
imports = [
/etc/nixos/hardware-configuration.nix
];
# Nix settings
## Limit Cores on rebuild and enable Flakes
nix = {
registry = {
voidarc = {
from = {
id = "voidarc";
type = "indirect";
};
to = {
type = "git";
url = "https://git.voidarc.co.uk/voidarc/flakes.git";
};
};
};
settings = {
cores = 6;
download-buffer-size = 524288000;
experimental-features = [
"nix-command"
"flakes"
];
};
};
## Allow unfree packages and add pkgs.unstable
nixpkgs = {
config = {
allowUnfree = true;
packageOverrides = pkgs: {
unstable = import inputs.nixpkgs-unstable {
config = {
allowUnfree = true;
};
};
};
};
};
# Set <nixpkgs> correctly
nix.nixPath = ["nixpkgs=${inputs.nixpkgs}"];
## Optimise Nix store on rebuild and collect garbage as a service
nix.optimise.automatic = true;
nix.gc = {
automatic = true;
dates = "daily";
options = "--delete-older-than 5d";
};
# Bootloader theming and plymouth
boot = {
loader = {
timeout = 2;
efi = {
canTouchEfiVariables = true;
};
grub = {
efiSupport = true;
device = "nodev";
theme = pkgs.catppuccin-grub;
};
};
plymouth = {
enable = true;
theme = "catppuccin-mocha";
themePackages = with pkgs; [
# By default we would install all themes
(catppuccin-plymouth.override {
variant = "mocha";
})
];
};
};
## Use latest kernel
boot.kernelPackages = pkgs.linuxPackages_latest;
# Bluetooth and Networking
hardware.bluetooth.enable = true;
hardware.xpadneo.enable = true;
networking.networkmanager.enable = true;
networking.networkmanager.dns = "none";
networking.nameservers = [
"1.1.1.1"
"8.8.8.8"
];
# Locale
time.timeZone = "Europe/London";
i18n.defaultLocale = "en_GB.UTF-8";
i18n.extraLocaleSettings = {
LC_ADDRESS = "en_GB.UTF-8";
LC_IDENTIFICATION = "en_GB.UTF-8";
LC_MEASUREMENT = "en_GB.UTF-8";
LC_MONETARY = "en_GB.UTF-8";
LC_NAME = "en_GB.UTF-8";
LC_NUMERIC = "en_GB.UTF-8";
LC_PAPER = "en_GB.UTF-8";
LC_TELEPHONE = "en_GB.UTF-8";
LC_TIME = "en_GB.UTF-8";
};
# Userspace Stuff
## Keymap
services.xserver.xkb = {
layout = "gb";
variant = "";
};
console.keyMap = "uk";
## Desktop
services.xserver.enable = true;
programs.hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.default;
};
security.polkit.enable = true;
## Audio Server
services.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
# Local User
## User config
users.users.user01 = {
isNormalUser = true;
shell = pkgs.zsh;
description = "user01";
extraGroups = [
"input"
"root"
"plugdev"
"bluetooth"
"networkmanager"
"docker"
"wheel"
];
packages = with pkgs; let
input = {
package,
output ? "default",
}:
inputs.${package}.packages.${pkgs.stdenv.hostPlatform.system}.${output};
wrap = {
name,
pkg,
modules,
}:
pkgs.symlinkJoin {
inherit name;
paths = [pkg];
nativeBuildInputs = [pkgs.makeWrapper];
postBuild = ''
wrapProgram $out/bin/${name} \
--prefix PATH : ${pkgs.lib.makeBinPath modules}
'';
};
in [
# Ricing
## Desktop
bibata-cursors
catppuccin-gtk
unstable.waybar
hyprlock
dunst
wlogout
wpaperd
quickshell
## Desktop Utilities
grimblast
gsettings-desktop-schemas
wl-clipboard
(wrap {
name = "otter-launcher";
pkg = (
input {
package = "otter-launcher";
}
);
modules = [
chafa
jq
];
})
(input {package = "fsel";})
# Terminal
## Styling / Functionality
oh-my-posh
carapace
zsh-autocomplete
bat
## Tools
lazygit
p7zip-rar
any-nix-shell
bluetui
fzf
ripgrep
wget
htop
playerctl
git
lsd
(input {
package = "doot";
})
## Other CLI Apps
nodejs
fastfetch
opencode
tailscale
syncthing
jellyfin-tui
devenv
nix-output-monitor
# Apps
## Actual Useful Stuff
nemo
kitty
firefox
gotify-desktop
pavucontrol
mpv
input-remapper
## Other Nonsense
tor-browser
techmino
prismlauncher
delfin
];
};
## Zsh
programs.zsh = {
enable = true;
enableCompletion = true;
enableBashCompletion = true;
autosuggestions.enable = true;
syntaxHighlighting.enable = true;
histSize = 10000;
ohMyZsh = {
enable = true;
plugins = [
"git"
"dirhistory"
"history"
];
};
};
users.defaultUserShell = pkgs.zsh;
## User programs
programs = {
dconf.enable = true;
xfconf.enable = true;
gdk-pixbuf.modulePackages = [pkgs.librsvg]; # For wlogout svgs
};
## User Services
services = {
gvfs.enable = true;
input-remapper.enable = true;
tailscale.enable = true;
printing.enable = true;
upower.enable = true;
openssh.enable = true;
avahi.enable = true;
};
## Fonts
fonts.packages = with pkgs; [
nerd-fonts.fira-mono
];
fonts.fontconfig.defaultFonts.serif = ["Fira Mono Nerd Font"];
# System Packages
environment.systemPackages = with pkgs; [
# Utilities
inputs.nvim-wrapped.packages.${stdenv.hostPlatform.system}.default
vim
unzip
python315
usbutils
curlWithGnuTls
# System
mesa
pkg-config
vulkan-tools
gvfs
wayvnc
clang
xdg-desktop-portal
xdg-desktop-portal-hyprland
glib
gnutls
liblzf
librsvg
appimage-run
libnotify
gsettings-desktop-schemas
];
# The comment
system.stateVersion = "25.05"; # Did you read the comment?
}

View File

@@ -1,49 +0,0 @@
{
config,
lib,
pkgs,
inputs,
...
}: {
networking.hostName = "mobile02"; # Define your hostname.
# Opengl and vulkan
hardware.graphics = {
enable = true;
extraPackages = with pkgs; [
intel-vaapi-driver
libva-vdpau-driver
];
};
services.displayManager.sddm = {
enable = true;
theme = "catppuccin-mocha-mauve";
package = pkgs.kdePackages.sddm;
};
environment.systemPackages = with pkgs; [
# Catppuccin sddm theme
(pkgs.catppuccin-sddm.override {
flavor = "mocha";
font = "Fira Mono Nerd Font";
fontSize = "11";
background = null;
})
];
# Local User
users.users.user01 = {
extraGroups = [];
packages = with pkgs; [
# Ricing
inputs.way-edges.packages.${stdenv.hostPlatform.system}.way-edges
inputs.chataigne.packages.${stdenv.hostPlatform.system}.default
# Terminal
# Apps
];
};
programs.steam.enable = true;
}

View File

@@ -1,184 +0,0 @@
{
config,
lib,
pkgs,
inputs,
...
}: {
networking.hostName = "HACKSTATION";
# Enable nix-ld to run unpatched binaries
programs.nix-ld.enable = true;
programs.nix-ld.libraries = with pkgs; [
stdenv.cc.cc
zlib
libusb1
];
# Add Samsung USB udev rules
services.udev.extraRules = ''
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"
'';
hardware.amdgpu.initrd.enable = true;
# Opengl and vulkan
hardware.graphics = {
enable = true;
extraPackages = with pkgs; [
libva-vdpau-driver
libvdpau-va-gl
];
enable32Bit = true;
};
hardware.amdgpu.opencl.enable = true;
boot.kernelParams = [
"amdgpu.ppfeaturemask=0xffffffff"
];
# Wake on Lan
networking.interfaces.enp5s0.wakeOnLan.enable = true;
networking.firewall.enable = false;
systemd.services.NetworkManager-wait-online.enable = false;
services.displayManager = {
autoLogin.enable = true;
autoLogin.user = "user01";
sddm = {
enable = true;
};
};
# Pipewire stuff
services.pipewire.extraConfig.pipewire."97-null-sink" = {
"context.objects" = [
{
factory = "adapter";
args = {
"factory.name" = "support.null-audio-sink";
"node.name" = "Null-Sink";
"node.description" = "Null Sink";
"media.class" = "Audio/Sink";
"audio.position" = "FL,FR";
};
}
{
factory = "adapter";
args = {
"factory.name" = "support.null-audio-sink";
"node.name" = "Null-Source";
"node.description" = "Null Source";
"media.class" = "Audio/Source";
"audio.position" = "FL,FR";
};
}
];
};
services.pipewire.extraConfig.pipewire."98-virtual-mic" = {
"context.modules" = [
{
name = "libpipewire-module-loopback";
args = {
"audio.position" = "FL,FR";
"node.description" = "Mumble as Microphone";
"capture.props" = {
# Mumble's output node name.
"node.target" = "Mumble";
"node.passive" = true;
};
"playback.props" = {
"node.name" = "Virtual-Mumble-Microphone";
"media.class" = "Audio/Source";
};
};
}
];
};
# Mumble server
services.murmur = {
enable = true;
bandwidth = 540000;
bonjour = true;
password = "mumblepass";
autobanTime = 0;
};
# Local User
users.users.user01 = {
extraGroups = [
"docker"
"input"
"udev"
"wheel"
];
packages = with pkgs; [
bottles
mumble
gajim
ferdium
delfin
docker
orca-slicer
ffmpeg
inputs.norgolith.packages.${pkgs.stdenv.hostPlatform.system}.default
inputs.cracked-davinci.packages.${pkgs.stdenv.hostPlatform.system}.default
inputs.woomer.packages.${pkgs.stdenv.hostPlatform.system}.default
# wine
wineWow64Packages.stable
winetricks
wine
wine64
freetype
];
};
environment.systemPackages = [
inputs.sls-steam.packages.${pkgs.stdenv.hostPlatform.system}.wrapped
];
programs.obs-studio = {
enable = true;
};
programs.wshowkeys = {
enable = true;
package = inputs.wshowkeys.packages.${pkgs.stdenv.hostPlatform.system}.default;
};
programs.steam = {
enable = true;
protontricks.enable = true;
extraCompatPackages = with pkgs; [
proton-ge-bin
];
package = pkgs.steam.override {
extraEnv = {
LD_AUDIT = "${
inputs.sls-steam.packages.${pkgs.stdenv.hostPlatform.system}.sls-steam
}/library-inject.so:${
inputs.sls-steam.packages.${pkgs.stdenv.hostPlatform.system}.sls-steam
}/SLSsteam.so";
};
};
};
services.unbound = {
enable = true;
};
services.wivrn = {
enable = true;
package = pkgs.unstable.wivrn;
openFirewall = true;
};
virtualisation.docker = {
enable = true;
enableOnBoot = false;
};
}

926
flake.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,86 +4,53 @@
inputs = {
# System
nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
nvim-wrapped.url = "git+file:///home/user01/.dotfiles/.config/nvim";
hyprland.url = "github:hyprwm/Hyprland";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# Apps
sls-steam.url = "github:AceSLS/SLSsteam";
woomer = {
url = "github:voidarclabs/woomer";
nvim.url = "git+https://git.voidarc.co.uk/voidarc/nvim";
hyprland = {
url = "git+https://git.voidarc.co.uk/voidarc/hypr";
inputs.nixpkgs.follows = "nixpkgs";
};
chataigne.url = "./modules/chataigne";
norgolith = {
url = "github:NTBBloodbath/norgolith";
inputs.nixpkgs.follows = "nixpkgs";
};
wshowkeys = {
url = "github:voidarclabs/wshowkeys";
inputs.nixpkgs.follows = "nixpkgs";
};
# Utils
doot = {
url = "github:voidarclabs/nixos.doot";
inputs.nixpkgs.follows = "nixpkgs";
};
way-edges = {
url = "github:way-edges/way-edges";
inputs.nixpkgs.follows = "nixpkgs";
hyprgrass = {
url = "github:horriblename/hyprgrass";
inputs.hyprland.follows = "hyprland/hyprland";
};
otter-launcher = {
url = "github:kuokuo123/otter-launcher";
inputs.nixpkgs.follows = "nixpkgs";
};
fsel = {
url = "github:Mjoyufull/fsel";
gotify-desktop = {
url = "github:voidarclabs/gotify-desktop";
inputs.nixpkgs.follows = "nixpkgs";
};
# Davinci-resolve
cracked-davinci.url = "git+https://git.voidarc.co.uk/voidarc/nixos.davinci";
sls-steam.url = "github:AceSLS/SLSsteam";
davinci.url = "git+https://git.voidarc.co.uk/voidarc/nixos.davinci";
quickshell = {
url = "git+https://git.voidarc.co.uk/voidarc/quickshell";
flake = false;
};
omnisearch = {
url = "git+https://git.voidarc.co.uk/voidarc/omnisearch";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = {
self,
nixpkgs,
...
} @ inputs: let
system = "x86_64-linux";
hardwareConfig = import /etc/nixos/hardware-configuration.nix;
common = import ./configs/common.nix;
mkSystem = extraModules:
nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = {inherit inputs;};
modules =
[
common
hardwareConfig
]
++ extraModules;
};
in {
nixosConfigurations = {
mobile02 = mkSystem [./configs/configuration-laptop.nix];
hackstation = mkSystem [
./configs/configuration-pc.nix
# ./modules/davinci/davinci.nix
./modules/i3/i3.nix
inputs.omnisearch.nixosModules.default
{
services.omnisearch.enable = true;
}
];
woomer = {
url = "github:voidarclabs/woomer";
inputs.nixpkgs.follows = "nixpkgs";
};
wshowkeys.url = "github:DreamMaoMao/wshowkeys";
# Secrets and stuff
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
# Flake parts
flake-parts.url = "github:hercules-ci/flake-parts";
import-tree.url = "github:vic/import-tree";
wrappers.url = "github:BirdeeHub/nix-wrapper-modules";
};
outputs = inputs: inputs.flake-parts.lib.mkFlake {inherit inputs;} (inputs.import-tree ./modules);
}

View File

@@ -0,0 +1,18 @@
{
self,
moduleWithSystem,
...
}: {
flake.nixosModules.bottles = moduleWithSystem ({pkgs, ...}: {
environment.systemPackages = with pkgs; [
(bottles.override {
removeWarningPopup = true;
})
wineWow64Packages.stable
winetricks
wine
wine64
freetype
];
});
}

View File

@@ -0,0 +1,19 @@
{
self,
moduleWithSystem,
...
}: {
flake.nixosModules.development = moduleWithSystem ({pkgs, ...}: let
modules = with self.nixosModules; [
git
nvim
];
in {
imports = modules;
environment.systemPackages = with pkgs; [
opencode
devenv
jellyfin-tui
];
});
}

View File

@@ -0,0 +1,16 @@
{
self,
moduleWithSystem,
...
}: {
flake.nixosModules.gaming = moduleWithSystem ({pkgs, ...}: let
modules = with self.nixosModules; [
steam
];
in {
imports = modules;
environment.systemPackages = with pkgs; [
prismlauncher
];
});
}

View File

@@ -0,0 +1,11 @@
{moduleWithSystem, ...}: {
flake.nixosModules.music = moduleWithSystem ({pkgs, unfreePkgs, ...}: {
environment.systemPackages = with pkgs; [
ardour
unfreePkgs.vital
distrho-ports
cardinal
calf
];
});
}

View File

@@ -0,0 +1,16 @@
{
self,
moduleWithSystem,
...
}: {
flake.nixosModules.youtube = moduleWithSystem ({...}: let
modules = with self.nixosModules; [
obs-studio
wshowkeys
woomer
mumble
];
in {
imports = modules;
});
}

View File

@@ -1,27 +0,0 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1780952837,
"narHash": "sha256-Fwd1+spDtQ0hDyBwme6ufG3n4mY0UrjjFdYHv+G/Hds=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "e820eb4a444b46a19b2e03e8dfd2359439ff30fe",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-25.11",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

View File

@@ -1,82 +0,0 @@
{
description = "Local wrapper for Chataigne AppImage";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
};
outputs = {
self,
nixpkgs,
}: let
system = "x86_64-linux";
pkgs = import nixpkgs {inherit system;};
# The libraries you requested
deps = with pkgs; [
curlFull
gnutls
libxrandr
alsa-lib
freetype
avahi
libglvnd
curl
SDL2
hidapi
libpulseaudio
lz4
openssl
libcap
libxcrypt
libgcrypt
libbsd
zlib
glib
];
# Wrap the local AppImage file
chataigne-bin = pkgs.appimageTools.wrapType2 {
pname = "chataigne";
version = "1.10.3";
# This points to the file in the same directory as flake.nix
src = ./Chataigne-linux-x64-1.10.3.AppImage;
extraPkgs = pkgs: deps;
};
# Create the Desktop Entry
chataigne-desktop = pkgs.makeDesktopItem {
name = "chataigne";
exec = "chataigne";
icon = "chataigne";
comment = "Modular machine for art and technology";
desktopName = "Chataigne";
categories = [
"AudioVideo"
"Development"
];
};
in {
# packages.${system}.default = chataigne-bin;
devShells.${system}.default = pkgs.mkShell {
# Packages you want available in your shell
buildInputs = [
chataigne-bin
];
# Environmental variables or shell hooks
shellHook = ''
echo "something"
'';
};
# This allows you to run 'nix run' or install it via system config
packages.${system}.default = pkgs.symlinkJoin {
name = "chataigne";
paths = [
chataigne-bin
chataigne-desktop
];
};
};
}

28
modules/empty.nix Normal file
View File

@@ -0,0 +1,28 @@
{
self,
moduleWithSystem,
...
}: {
flake.nixosModules.name = moduleWithSystem ({
pkgs,
self',
inputs',
...
}: let
modules = with self.nixosModules; [];
in {
imports = modules;
programs.name = {
enable = true;
package = self'.packages.hello;
};
});
perSystem = {
pkgs,
lib,
self',
...
}: {
packages.hello = pkgs.hello;
};
}

View File

@@ -0,0 +1,14 @@
{
moduleWithSystem,
self,
...
}: {
flake.nixosModules.davinci = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
davinci-resolve
];
});
perSystem = {inputs', ...}: {
packages.davinci-resolve = inputs'.davinci.packages.default;
};
}

View File

@@ -0,0 +1,27 @@
{moduleWithSystem, ...}: {
flake.nixosModules.distcc = moduleWithSystem ({unstablePkgs, ...}: {
services.distccd = {
enable = true;
allowedClients = ["192.168.1.0/24"];
};
systemd.services.distccd = {
serviceConfig = {
Environment = [
"\"PATH=/run/wrappers/bin:/run/current-system/sw/bin:/usr/bin:/bin\""
"DISTCCD_PATH=/run/current-system/sw/bin:/run/wrappers/bin:/usr/bin:/bin"
];
};
};
environment.systemPackages = let
pkgs = unstablePkgs;
lib = pkgs.lib;
in [
(pkgs.writeShellScriptBin "x86_64-pc-linux-gnu-gcc" ''
exec ${lib.getExe pkgs.gcc15} "$@"
'')
(pkgs.writeShellScriptBin "x86_64-pc-linux-gnu-g++" ''
exec ${lib.getExe' pkgs.gcc15 "g++"} "$@"
'')
];
});
}

View File

@@ -0,0 +1,40 @@
{
self,
inputs,
...
}: {
flake.nixosModules.git = {
pkgs,
lib,
...
}: {
programs.git = {
enable = true;
package = self.packages.${pkgs.stdenv.hostPlatform.system}.git;
};
programs.gnupg.agent = {
enable = true;
pinentryPackage = pkgs.pinentry-all;
};
};
perSystem = {
pkgs,
lib,
self',
...
}: {
packages.git = inputs.wrappers.wrappers.git.wrap {
inherit pkgs;
runtimePkgs = with pkgs; [
git-secret
];
settings = {
user = {
email = "admin@voidarc.co.uk";
name = "voidarc";
};
credential.helper = "store";
};
};
};
}

View File

@@ -0,0 +1,35 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.gotify-desktop = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
gotify-desktop
];
});
perSystem = {
pkgs,
inputs',
...
}: {
packages = {
gotify-desktop = let
config-file = pkgs.writeText "config.toml" ''
[gotify]
url = "wss://ntfy.voidarc.co.uk:443"
token = { command = "cat /run/secrets/gotify-desktop-key"}
[notification]
min_priority = 1
'';
in
inputs.wrappers.lib.wrapPackage ({...}: {
inherit pkgs;
package = inputs'.gotify-desktop.packages.default;
flags = {
"-c" = config-file;
};
});
};
};
}

Binary file not shown.

View File

@@ -0,0 +1,116 @@
{
moduleWithSystem,
self,
inputs,
...
}: {
flake.nixosModules.hyprland = moduleWithSystem ({
self',
pkgs,
inputs',
flakeLocation,
...
}: {config, ...}: let
modules = with self.nixosModules; [
audio
systemTheme
quickshell
];
runtimePkgs = self'.packages.hyprland.passthru.runtimePackages;
lib = pkgs.lib;
runtimeTarget = name: pkg:
if config.security.wrappers ? ${name}
then "/run/wrappers/bin/${name}"
else lib.getExe pkg;
in {
imports = modules;
options = {
tabletSupport = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable tablet support across all modules";
};
};
config = {
programs.hyprland = {
enable = true;
package = self'.packages.hyprland;
};
services.displayManager.defaultSession = "hyprland";
services.xserver.enable = true;
services.seatd.enable = true;
security.polkit.enable = true;
environment.systemPackages = with pkgs; [
gsettings-desktop-schemas
glib
];
system.activationScripts.hyprRuntimeEnv = lib.stringAfter ["specialfs"] ''
mkdir -p /run/hypr-runtime-env/bin
${lib.concatStringsSep "\n" (lib.mapAttrsToList (name: pkg: ''
ln -sfn ${runtimeTarget name pkg} /run/hypr-runtime-env/bin/${name}
'')
runtimePkgs)}
'';
system.activationScripts.hyprConfig = let
hyprgrassPath = "${inputs'.hyprgrass.packages.default}/lib/libhyprgrass.so";
pluginFile = pkgs.writeText "plugins.lua" ''
hl.on("hyprland.start", function ()
${lib.optionalString config.tabletSupport ''
hl.exec_cmd("hyprctl plugin load ${hyprgrassPath}")
''}
end)
'';
# Easy way to get nix runtime info (ie the directory the config is at)
# into hyprland to run commands and stuff
runtimeFile = pkgs.writeText "runtime.lua" ''
hl.on("hyprland.start", function ()
${lib.optionalString (flakeLocation != "") ''
hl.exec_cmd( 'curl -X POST -H "Content-Type: application/json" -d "{\"ref\":\"$(git -C ${flakeLocation} rev-parse HEAD)\", \"status\":\"$(git -C ${flakeLocation} diff --quiet && echo "clean" || echo "dirty")\"}" https://n8n.voidarc.co.uk/webhook/config-checker' )
''}
end)
'';
in
lib.stringAfter ["specialfs"] ''
mkdir -p /run/hypr/config
rm -rf /run/hypr/config/*
ln -sfn ${inputs'.hyprland.packages.repo-files}/* /run/hypr/config
ln -sfn ${pluginFile} /run/hypr/config/plugins.lua
ln -sfn ${runtimeFile} /run/hypr/config/runtime.lua
'';
};
});
perSystem = {
self',
system,
inputs',
...
}: {
packages = {
hyprland = inputs'.hyprland.packages.default.override {
flags."--config" = "/run/hypr/config/hyprland.lua";
env."MODULES_ROOT" = "/run/hypr/config/modules";
env."HYPRLAND_ROOT" = "/run/hypr/config";
runtimePackages =
inputs.hyprland.lib.defaultRuntimePkgs.${system}
// {
wpaperd = self'.packages.wpaperd;
kitty = self'.packages.kitty;
gotify-desktop = self'.packages.gotify-desktop;
otter-launcher = self'.packages.otter-launcher;
hyprlock = self'.packages.hyprlock;
quickshell = self'.packages.quickshell;
wshowkeys = self'.packages.wshowkeys;
way-edges = self'.packages.way-edges;
};
};
};
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,129 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.hyprlock = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
hyprock
];
});
perSystem = {pkgs, ...}: {
packages.hyprlock = inputs.wrappers.wrappers.hyprlock.wrap {
inherit pkgs;
"hyprlock.conf".content = ''
source = ${./mocha.conf}
$accent = $mauve
$accentAlpha = $mauveAlpha
$font = FiraMono Nerd Font
# GENERAL
general {
hide_cursor = true
}
# BACKGROUND
background {
monitor =
path = screenshot
blur_passes = 3
color = rgba(0, 0, 0, 0)
}
# LAYOUT
label {
monitor =
text = Layout: $LAYOUT
color = $text
font_size = 25
font_family = $font
position = 30, -30
halign = left
valign = top
}
# TIME
label {
monitor =
text = $TIME
color = $text
font_size = 90
font_family = $font
position = -30, 0
halign = right
valign = top
}
# DATE
label {
monitor =
text = cmd[update:43200000] date +"%A, %d %B %Y"
color = $text
font_size = 25
font_family = $font
position = -30, -150
halign = right
valign = top
}
# FINGERPRINT
{
monitor = "";
text = "$FPRINTPROMPT";
color = "$text";
font_size = 14;
font_family = $font;
position = "0, -107";
halign = "center";
valign = "center";
}
image {
path = ${./cat.png}
size = 240
border_color = transparent
rounding = 0
position = 0, 7px
}
# USER AVATAR
image {
monitor =
path = $HOME/.face
size = 100
border_color = $accent
position = 0, 75
halign = center
valign = center
}
# INPUT FIELD
input-field {
monitor =
size = 300, 60
outline_thickness = 4
dots_size = 0.2
dots_spacing = 0.2
dots_center = true
outer_color = $accent
inner_color = $surface0
font_color = $text
fade_on_empty = false
placeholder_text = <span foreground="##$textAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
hide_input = false
check_color = $accent
fail_color = $red
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
capslock_color = $yellow
position = 0, -47
halign = center
valign = center
}
'';
};
};
}

View File

@@ -0,0 +1,79 @@
$rosewater = rgb(f5e0dc)
$rosewaterAlpha = f5e0dc
$flamingo = rgb(f2cdcd)
$flamingoAlpha = f2cdcd
$pink = rgb(f5c2e7)
$pinkAlpha = f5c2e7
$mauve = rgb(cba6f7)
$mauveAlpha = cba6f7
$red = rgb(f38ba8)
$redAlpha = f38ba8
$maroon = rgb(eba0ac)
$maroonAlpha = eba0ac
$peach = rgb(fab387)
$peachAlpha = fab387
$yellow = rgb(f9e2af)
$yellowAlpha = f9e2af
$green = rgb(a6e3a1)
$greenAlpha = a6e3a1
$teal = rgb(94e2d5)
$tealAlpha = 94e2d5
$sky = rgb(89dceb)
$skyAlpha = 89dceb
$sapphire = rgb(74c7ec)
$sapphireAlpha = 74c7ec
$blue = rgb(89b4fa)
$blueAlpha = 89b4fa
$lavender = rgb(b4befe)
$lavenderAlpha = b4befe
$text = rgb(cdd6f4)
$textAlpha = cdd6f4
$subtext1 = rgb(bac2de)
$subtext1Alpha = bac2de
$subtext0 = rgb(a6adc8)
$subtext0Alpha = a6adc8
$overlay2 = rgb(9399b2)
$overlay2Alpha = 9399b2
$overlay1 = rgb(7f849c)
$overlay1Alpha = 7f849c
$overlay0 = rgb(6c7086)
$overlay0Alpha = 6c7086
$surface2 = rgb(585b70)
$surface2Alpha = 585b70
$surface1 = rgb(45475a)
$surface1Alpha = 45475a
$surface0 = rgb(313244)
$surface0Alpha = 313244
$base = rgb(1e1e2e)
$baseAlpha = 1e1e2eee
$mantle = rgb(181825)
$mantleAlpha = 181825
$crust = rgb(11111b)
$crustAlpha = 11111b

View File

@@ -0,0 +1,71 @@
set $mod Mod1
set $term kitty
set $menu dmenu_run
exec --no-startup-id xrandr --output HDMI-1 --mode 1920x1080 --rate 60 --pos -1920x0 --output DP-1 --mode 1920x1080 --rate 60 --pos 0x0 --output DP-2 --mode 1920x1080 --rate 60 --pos 1920x0
font pango:FiraMono Nerd Font 10
workspace 1 output DP-1
workspace 2 output HDMI-A-1
workspace 3 output DP-2
# Window functions
bindsym $mod+BackSpace kill
bindsym $mod+b fullscreen toggle
# Apps
bindsym $mod+Return exec --no-startup-id $term
bindsym $mod+d exec --no-startup-id $menu
bindsym $mod+f exec --no-startup-id firefox
bindsym $mod+s exec --no-startup-id nemo
# Focus windows
bindsym $mod+k focus up
bindsym $mod+j focus down
bindsym $mod+h focus left
bindsym $mod+l focus right
# Move windows
bindsym $mod+Shift+h move left
bindsym $mod+Shift+l move right
bindsym $mod+Shift+k move up
bindsym $mod+Shift+j move down
# Workspaces
bindsym $mod+q workspace number 1
bindsym $mod+w workspace number 2
bindsym $mod+e workspace number 3
bindsym $mod+r workspace number 4
bindsym $mod+t workspace number 5
bindsym $mod+y workspace number 6
bindsym $mod+u workspace number 7
bindsym $mod+i workspace number 8
bindsym $mod+o workspace number 9
bindsym $mod+p workspace number 10
# Move container to workspace
bindsym $mod+Shift+q move container to workspace number 1
bindsym $mod+Shift+w move container to workspace number 2
bindsym $mod+Shift+e move container to workspace number 3
bindsym $mod+Shift+r move container to workspace number 4
bindsym $mod+Shift+t move container to workspace number 5
bindsym $mod+Shift+y move container to workspace number 6
bindsym $mod+Shift+u move container to workspace number 7
bindsym $mod+Shift+i move container to workspace number 8
bindsym $mod+Shift+o move container to workspace number 9
bindsym $mod+Shift+p move container to workspace number 10
# Logout menu
bindsym $mod+Shift+a exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
# Reload
bindsym $mod+Shift+m reload
# Drag windows with titlebar
tiling_drag modifier titlebar
# Bar
bar {
status_command i3status
}

View File

@@ -0,0 +1,52 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.i3 = moduleWithSystem ({
pkgs,
self',
...
}: {
services.xserver = {
enable = true;
desktopManager = {
xterm.enable = false;
};
windowManager.i3 = {
enable = true;
package = self'.packages.i3;
extraPackages = with pkgs; [
dmenu
i3status
xinit
];
};
};
});
perSystem = {
pkgs,
lib,
self',
...
}: {
packages.i3 = lib.warn "i3 is no longer maintained and therefore marked as deprecated" inputs.wrappers.lib.wrapPackage ({...}: {
inherit pkgs;
package = pkgs.i3;
runtimePkgs = with pkgs;
[
xrandr
firefox
]
++ (with self'.packages; [
kitty
nemo
]);
flags = {
"-c" = ./config;
};
});
};
}

View File

@@ -0,0 +1,49 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.kitty = moduleWithSystem (
{self'}: {
environment.systemPackages = with self'.packages; [
kitty
];
}
);
perSystem = {pkgs, ...}: {
packages.kitty = let
fira-mono = pkgs.nerd-fonts.fira-mono;
fontsConf = pkgs.makeFontsConf {
fontDirectories = [fira-mono];
};
in
inputs.wrappers.wrappers.kitty.wrap {
inherit pkgs;
environment = {
"FONTCONFIG_FILE" = "${fontsConf}";
};
font = {
name = "FiraMono Nerd Font Mono";
size = 11;
};
settings = {
font_size = 11;
scrollbar = "never";
pixel_scroll = false;
window_padding_width = 9;
background_opacity = 0.50;
confirm_os_window_close = 0;
enable_audio_bell = false;
cursor_trail = 1;
cursor_trail_start_threshold = 1;
cursor_trail_color = "#cba6f7";
cursor_shape = "beam";
allow_remote_control = true;
};
keybindings = {
"ctrl+backspace" = "send_text all \\x17";
};
themeFile = "Catppuccin-Mocha";
};
};
}

View File

@@ -0,0 +1,51 @@
{
self,
inputs,
...
}: {
flake.nixosModules.lazygit = {
pkgs,
lib,
...
}: {
environment.systemPackages = with pkgs; [
self.packages.${pkgs.stdenv.hostPlatform.system}.lazygit
];
};
perSystem = {
pkgs,
lib,
self',
...
}: let
config-file = pkgs.writeText "config.yml" ''
gui:
nerdFontsVersion: "3"
customCommands:
- key: 'p'
context: 'global'
command: 'git pull --recurse-submodules'
loadingText: 'Pulling with submodules'
output: 'log'
- key: '<c-p>'
context: 'global'
command: 'git pull'
loadingText: 'Pulling remote repo'
output: 'log'
'';
in {
packages.lazygit = inputs.wrappers.lib.wrapPackage ({
config,
wlib,
lib,
...
}: {
inherit pkgs;
package = pkgs.lazygit;
flags = {
"--use-config-file" = config-file;
};
});
};
}

View File

@@ -0,0 +1,75 @@
{
self,
inputs,
...
}: {
flake.nixosModules.mumble = {
pkgs,
lib,
...
}: let
modules = with self.nixosModules; [
audio
];
in {
imports = modules;
services.murmur = {
enable = true;
bandwidth = 540000;
bonjour = true;
password = "password";
autobanTime = 0;
};
environment.systemPackages = with pkgs; [
mumble
];
services.pipewire.extraConfig.pipewire = {
"97-null-sink" = {
"context.objects" = [
{
factory = "adapter";
args = {
"factory.name" = "support.null-audio-sink";
"node.name" = "Null-Sink";
"node.description" = "Null Sink";
"media.class" = "Audio/Sink";
"audio.position" = "FL,FR";
};
}
{
factory = "adapter";
args = {
"factory.name" = "support.null-audio-sink";
"node.name" = "Null-Source";
"node.description" = "Null Source";
"media.class" = "Audio/Source";
"audio.position" = "FL,FR";
};
}
];
};
"98-virtual-mic" = {
"context.modules" = [
{
name = "libpipewire-module-loopback";
args = {
"audio.position" = "FL,FR";
"node.description" = "Mumble as Microphone";
"capture.props" = {
# Mumble's output node name.
"node.target" = "Mumble";
"node.passive" = true;
};
"playback.props" = {
"node.name" = "Virtual-Mumble-Microphone";
"media.class" = "Audio/Source";
};
};
}
];
};
};
};
}

View File

@@ -0,0 +1,11 @@
{moduleWithSystem, ...}: {
flake.nixosModules.nvim = moduleWithSystem ({self', ...}: {
programs.neovim = {
enable = true;
package = self'.packages.nvim;
};
});
perSystem = {inputs', ...}: {
packages.nvim = inputs'.nvim.packages.default;
};
}

View File

@@ -0,0 +1,8 @@
{moduleWithSystem, ...}: {
flake.nixosModules.obs-studio = moduleWithSystem ({...}: {
programs.obs-studio = {
enable = true;
enableVirtualCamera = true;
};
});
}

View File

@@ -0,0 +1,14 @@
{
moduleWithSystem,
inputs,
...
}: {
flake.nixosModules.omnisearch = moduleWithSystem ({...}: let
modules = [
inputs.omnisearch.nixosModules.default
];
in {
imports = modules;
services.omnisearch.enable = true;
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

View File

@@ -0,0 +1,111 @@
[general]
default_module = "app" # module to run when no prefix is matched
empty_module = "app" # run with an empty prompt
exec_cmd = "zsh -c" # exec command of your shell
vi_mode = false # set true to use vi keybinds, false emacs keybinds
esc_to_abort = true # useful for vi users
cheatsheet_entry = "?" # when prompted, will show a list of configured modules
cheatsheet_viewer = "less -R; clear" # command to show cheatsheet; through piping stdout
clear_screen_after_execution = false
loop_mode = false # don't quit after executing a module, useful with scratchpads; stderr is hidden in loop mode
external_editor = "nvim" # if set, press ctrl+x ctrl+ee (or v in vi normal mode) to edit prompt in the specified program
delay_startup = 0 # sometimes the otter runs too fast even before the terminal window is ready; this slows it down by milliseconds; useful when chafa image is skewed
[interface]
# use three quotes to write longer codes
header = """
\x1b[1;38;2;203;166;247m$USER@nixos\x1b[0m
"""
header_cmd = '' # run a command and print stdout above the header
header_cmd_trimmed_lines = 0 # remove trailing lines from header_cmd output, in case of some programs appending excessive empty lines
place_holder = "execute" # at the input field
suggestion_mode = "list" # available options: list, hint
separator = """
$( \
text=" "; \
printf "\u001B[0;90m$text \
$(printf -v line '%*s' \"$(( COLUMNS - $(printf "$text" | wc -m) - 3 ))\" ''; printf '%s' \"${line// /─}\")" \
)"""
footer = "" # add a line after suggestion list
suggestion_lines = 7 # 0 to disable suggestions and tab completion
list_prefix = " "
selection_prefix = "\u001B[31;1m "
prefix_padding = 3 # format prefixes to have a uniformed width
default_module_message = " \u001B[33mlaunch\u001B[0m app" # shown when the default module is in use
empty_module_message = "" # shown when the empty module is in use
customized_list_order = false # false to list modules alphabetically; true to list as per the configured order in the below [[modules]] section
indicator_with_arg_module = " * " # the sign showing whether a module should run with an argument
indicator_no_arg_module = " "
# below color options affect all modules; per-module coloring can be configured using ansi codes individually
prefix_color = "\u001B[33m"
description_color = "\u001B[39m"
place_holder_color = "\u001B[30m"
hint_color = "\u001B[30m" # suggestion color in hint mode
# move the interface rightward or downward
move_interface_right = 21
move_interface_down = 0
[[modules]]
description = "programs"
prefix = "app"
cmd = """
hyprctl dispatch 'hl.dsp.window.resize({x = 700, y = 700, window = activewindow})' &&
hyprctl dispatch 'hl.dsp.window.center({window = activewindow})'&&
hyprctl dispatch "hl.dsp.exec_cmd('$(fsel --no-exec)')"
"""
[[modules]]
description = "bluetooth"
prefix = "bl"
cmd = """
hyprctl dispatch 'hl.dsp.window.resize({x = 650, y = 400, window = activewindow})' &&
hyprctl dispatch 'hl.dsp.window.center({window = activewindow})'&&
bluetui
"""
[[modules]]
description = "nixos wiki"
prefix = "nw"
cmd = """
hyprctl dispatch "hl.dsp.exec_cmd('firefox --new-window https://wiki.nixos.org/w/index.php?search={}')"
"""
with_argument = true
url_encode = true
unbind_proc = true
[[modules]]
description = "nixpkgs"
prefix = "nix"
cmd = """
hyprctl dispatch "hl.dsp.exec_cmd('firefox --new-window https://search.nixos.org/packages?query={}')"
"""
with_argument = true
url_encode = true
unbind_proc = true
[[modules]]
description = "jellyfin"
prefix = "jf"
cmd = """
hyprctl dispatch 'hl.dsp.exec_cmd("kitty --class jf-tui -e jellyfin-tui", {workspace = "special:music"})'
"""
[[modules]]
description = "youtube"
prefix = "y"
cmd = """
hyprctl dispatch "hl.dsp.exec_cmd('firefox --new-window https://www.youtube.com')"
"""
with_argument = false
url_encode = true
unbind_proc = true
[[modules]]
description = "whatsapp"
prefix = "w"
cmd = """
hyprctl dispatch "hl.dsp.exec_cmd('firefox --new-window https://web.whatsapp.com')"
"""
with_argument = false
url_encode = true
unbind_proc = true

View File

@@ -0,0 +1,44 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.otter-launcher = moduleWithSystem ({self', ...}: {
environment.systemPackages = [
self'.packages.otter-launcher
];
});
perSystem = {
pkgs,
lib,
self',
inputs',
...
}: {
packages = {
otter-launcher = let
extra-config = ''
[overlay]
overlay_cmd = "${lib.getExe pkgs.kitty} +kitten icat --fit height --align left --no-trailing-newline ${./cat.png}"
overlay_trimmed_lines = 0
'';
final-config = pkgs.writeText "config.toml" ''
${extra-config}
${builtins.readFile ./config.toml}
'';
in
inputs.wrappers.lib.wrapPackage ({...}: {
inherit pkgs;
package = inputs'.otter-launcher.packages.default;
runtimePkgs = with pkgs; [
fsel
bluetui
];
flags = {
"-c" = final-config;
};
});
};
};
}

View File

@@ -0,0 +1,32 @@
{
moduleWithSystem,
inputs,
...
}: {
flake.nixosModules.quickshell = moduleWithSystem ({
self',
pkgs,
...
}: {config, ...}: {
environment.systemPackages = with self'.packages;
[
quickshell
]
++ (
if config.tabletSupport == true
then
# If on tablet enable on screen keyboard
(with pkgs; [
wvkbd
])
else []
);
});
perSystem = {pkgs, ...}: {
packages.quickshell = inputs.wrappers.wrappers.quickshell.wrap {
inherit pkgs;
configDir = inputs.quickshell;
configFile = "${inputs.quickshell}/shell.qml";
};
};
}

View File

@@ -0,0 +1,16 @@
{
self,
inputs,
...
}: {
flake.nixosModules.sddm-autologin = {
pkgs,
lib,
...
}: {
services.displayManager = {
autoLogin.enable = true;
autoLogin.user = "user01";
};
};
}

View File

@@ -0,0 +1,25 @@
{
self,
inputs,
...
}: {
flake.nixosModules.sddm = {
pkgs,
lib,
...
}: {
environment.systemPackages = [
(pkgs.catppuccin-sddm.override {
flavor = "mocha";
font = "Fira Mono Nerd Font";
fontSize = "11";
background = null;
})
];
services.displayManager.sddm = {
enable = true;
theme = "catppuccin-mocha-mauve";
package = pkgs.kdePackages.sddm;
};
};
}

View File

@@ -0,0 +1,24 @@
{inputs, ...}: {
flake.nixosModules.sops = {config, ...}: {
imports = [inputs.sops-nix.nixosModules.sops];
sops = {
age.keyFile = "/etc/sops/age/keys.txt";
defaultSopsFile = ./secrets.yaml;
secrets = {
gotify-desktop-key = {
# Make readable
mode = "0444";
};
};
templates = {
"gotify-desktop-key".content = config.sops.placeholder.gotify-desktop-key;
};
};
# Make the secrets dir readable to normal users
systemd.tmpfiles.rules = [
"d /run/secrets 0755 root root -"
];
};
}

View File

@@ -0,0 +1,16 @@
gotify-desktop-key: ENC[AES256_GCM,data:kMCJfkrf5jKAgjX9hT9S,iv:T/zDp94522MeW6V3874JgyaQCx5H1qY+DsZOoPBaC1w=,tag:Csu+9imWiMBYXaE0uXzMsg==,type:str]
sops:
age:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKR3ZQTzVxWWFFam91Y1V0
VGdnSkZFcmJ6RG1JOHp3R1puY2ZRazkxbmlZCjYyek5QOWEzaWg2bnpXc0ZrNks0
QUl2Nk45R1h6WjFTSWlveUF5RHlRcEUKLS0tIE5mYmQ1aWpvNGNjYzJrUW9DSXpm
MS8ralY4WDI1YjhNSmRWYWxYL3VkbDAKQuLvaHiUXkwiaOif10vrl3LFh/4mKQUV
Y3HJ9Jr3DAyokEzN7S/S1v50coM1bE4d74SS/V1uIw0nYdZRUGrZww==
-----END AGE ENCRYPTED FILE-----
recipient: age1rg4rsns375z2zj4tv8cyqtjl504fw8tprlmj2w057dz6ztttjstsgjvkvy
lastmodified: "2026-09-25T19:37:14Z"
mac: ENC[AES256_GCM,data:OMk7qEbx9F/qa6zERu23fNyTzfxbTJZnPyPdVbXhZvjX+KB8pFE1bks6Qfw/C0TwcYsUBIFgr/YO0IaBLStkdoADpeqN4wRbunwTCND0w6V3ZOGza7+5UiT0Zp2KEamuTTco4mDdBUoBkid+aW0jlqAfKtZ4v9VH34IsEOjT2T8=,iv:uqMTZj/rsMFmOWy4aXblmsZ4TVji2i8SfqpCs21VQOU=,tag:x4LtAV6+i8npKygjWjDRpQ==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3

View File

@@ -0,0 +1,30 @@
{moduleWithSystem, ...}: {
flake.nixosModules.steam = moduleWithSystem ({
pkgs,
unfreePkgs,
inputs',
lib,
...
}: {
# If buying isn't owning than piracy isn't stealing
environment.systemPackages = [
inputs'.sls-steam.packages.default
];
programs.steam = {
enable = true;
protontricks.enable = true;
extraCompatPackages = with pkgs; [
proton-ge-bin
];
package = unfreePkgs.steam.override {
extraEnv = {
LD_AUDIT = "${
inputs'.sls-steam.packages.sls-steam
}/library-inject.so:${
inputs'.sls-steam.packages.sls-steam
}/SLSsteam.so";
};
};
};
});
}

View File

@@ -0,0 +1,11 @@
{
self,
moduleWithSystem,
...
}: {
flake.nixosModules.tailscale = moduleWithSystem ({...}: {
services.tailscale = {
enable = true;
};
});
}

View File

@@ -0,0 +1,151 @@
" cyberdream.vim - Cyberdream theme for Vim
" Maintainer: 0l3d
" Description: Cyberdream theme for Vim
highlight clear
if exists("syntax_on")
syntax reset
endif
let g:colors_name = "cyberdream"
set termguicolors
" ─────────────────────────────────────────────────────────────
" Core UI
" ─────────────────────────────────────────────────────────────
highlight Normal guifg=#ffffff guibg=#16181a
highlight NormalNC guifg=#ffffff guibg=#16181a
highlight Cursor guifg=#16181a guibg=#ffffff
highlight CursorLine guibg=#3c4048
highlight CursorColumn guibg=#3c4048
highlight CursorLineNr guifg=#7b8496
highlight LineNr guifg=#7b8496
highlight ColorColumn guibg=#3c4048
highlight Visual guibg=#3c4048
highlight VisualNOS guibg=#3c4048
highlight MatchParen guifg=#ff5ea0 guibg=#3c4048
highlight Search guifg=#1e2124 guibg=#ffffff
highlight IncSearch guifg=#1e2124 guibg=#5ef1ff
highlight CurSearch guifg=#1e2124 guibg=#5ef1ff
highlight Directory guifg=#5ea1ff
highlight VertSplit guifg=#3c4048 guibg=#16181a
highlight WinSeparator guifg=#3c4048 guibg=#16181a
highlight EndOfBuffer guifg=#7b8496
" ─────────────────────────────────────────────────────────────
" Popup / Float
" ─────────────────────────────────────────────────────────────
highlight NormalFloat guifg=#ffffff guibg=#16181a
highlight FloatBorder guifg=#3c4048 guibg=#16181a
highlight FloatTitle guifg=#5ef1ff guibg=#16181a
highlight Pmenu guifg=#ffffff guibg=#16181a
highlight PmenuSel guifg=#ffffff guibg=#3c4048
highlight PmenuSbar guifg=#16181a guibg=#3c4048
highlight PmenuThumb guifg=#16181a guibg=#3c4048
highlight PmenuMatch guifg=#5ef1ff guibg=#3c4048
highlight PmenuMatchSel guifg=#5ef1ff guibg=#3c4048
" ─────────────────────────────────────────────────────────────
" Diff
" ─────────────────────────────────────────────────────────────
highlight DiffAdd guifg=#5eff6c guibg=#3c4048
highlight DiffChange guifg=#5ea1ff guibg=#3c4048
highlight DiffDelete guifg=#ff6e5e guibg=#3c4048
highlight DiffText guifg=#ffbd5e guibg=#3c4048
highlight Added guifg=#5eff6c
highlight Removed guifg=#ff6e5e
" ─────────────────────────────────────────────────────────────
" Diagnostics / LSP
" ─────────────────────────────────────────────────────────────
highlight DiagnosticError guifg=#ff6e5e
highlight DiagnosticWarn guifg=#ffe95e
highlight DiagnosticInfo guifg=#5ea1ff
highlight DiagnosticHint guifg=#5ef1ff
highlight DiagnosticUnnecessary guifg=#7b8496
highlight DiagnosticVirtualTextError guifg=#ff6e5e
highlight DiagnosticVirtualTextWarn guifg=#ffe95e
highlight DiagnosticVirtualTextInfo guifg=#5ea1ff
highlight DiagnosticVirtualTextHint guifg=#5ef1ff
highlight DiagnosticUnderlineError gui=undercurl guisp=#ff6e5e
highlight DiagnosticUnderlineWarn gui=undercurl guisp=#ffe95e
highlight DiagnosticUnderlineInfo gui=undercurl guisp=#5ea1ff
highlight DiagnosticUnderlineHint gui=undercurl guisp=#5ef1ff
highlight LspReferenceText guibg=#3c4048
highlight LspReferenceRead guibg=#3c4048
highlight LspReferenceWrite guibg=#3c4048
highlight LspSignatureActiveParameter guifg=#ffbd5e
highlight LspCodeLens guifg=#7b8496
highlight LspInlayHint guifg=#7b8496
" ─────────────────────────────────────────────────────────────
" Syntax
" ─────────────────────────────────────────────────────────────
highlight Comment guifg=#7b8496 gui=italic
highlight Constant guifg=#ffbd5e
highlight String guifg=#5eff6c
highlight Character guifg=#5eff6c
highlight Boolean guifg=#ffbd5e
highlight Number guifg=#ffbd5e
highlight Identifier guifg=#5ea1ff
highlight Function guifg=#5ea1ff
highlight Statement guifg=#bd5eff
highlight Operator guifg=#bd5eff
highlight Keyword guifg=#ffbd5e
highlight PreProc guifg=#bd5eff
highlight Label guifg=#5ef1ff
highlight Type guifg=#ffe95e
highlight Special guifg=#ff5ea0
highlight Delimiter guifg=#ffffff
highlight Debug guifg=#ffbd5e
highlight Error guifg=#ff6e5e
highlight Todo guifg=#bd5eff gui=bold
" ─────────────────────────────────────────────────────────────
" Markdown
" ─────────────────────────────────────────────────────────────
highlight markdownHeadingDelimiter guifg=#7b8496
highlight markdownCode guifg=#5ef1ff
highlight markdownCodeBlock guifg=#5ef1ff
highlight markdownH1 guifg=#ffbd5e gui=bold
highlight markdownH2 guifg=#5ef1ff gui=bold
highlight markdownH3 guifg=#5ea1ff gui=bold
highlight markdownH4 guifg=#bd5eff gui=bold
highlight markdownH5 guifg=#ff5ef1 gui=bold
highlight markdownH6 guifg=#5eff6c gui=bold
highlight markdownLinkText guifg=#5ea1ff gui=underline
" ─────────────────────────────────────────────────────────────
" UI Bars
" ─────────────────────────────────────────────────────────────
highlight StatusLine guifg=#ffffff guibg=#16181a
highlight StatusLineNC guifg=#7b8496 guibg=#16181a
highlight TabLine guifg=#7b8496 guibg=#16181a
highlight TabLineFill guifg=#7b8496 guibg=#16181a
highlight TabLineSel guifg=#ffffff guibg=#3c4048
highlight WinBar guifg=#ffffff guibg=#16181a
highlight WinBarNC guifg=#7b8496 guibg=#16181a
" ─────────────────────────────────────────────────────────────
" Misc
" ─────────────────────────────────────────────────────────────
highlight SpecialKey guifg=#7b8496
highlight Whitespace guifg=#3c4048
highlight Question guifg=#ffe95e
highlight MoreMsg guifg=#5ea1ff
highlight WarningMsg guifg=#ffbd5e
highlight ErrorMsg guifg=#ff6e5e
highlight QuickFixLine guibg=#3c4048
highlight qfLineNr guifg=#7b8496
highlight qfFileName guifg=#5ea1ff

View File

@@ -0,0 +1,22 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.vim = moduleWithSystem ({pkgs, ...}: let
modules = [];
in {});
perSystem = {pkgs, ...}: {
packages.vim = inputs.wrappers.wrappers.vim.wrap {
inherit pkgs;
plugins = with pkgs.vimPlugins; [
# vim-lsp
# vim-lsp-settings
# asyncomplete-vim
# asyncomplete-lsp-vim
ale
];
vimrc = builtins.readFile ./vimrc;
};
};
}

View File

@@ -0,0 +1,62 @@
" Set colorscheme and enable highlighting
colorscheme catppuccin
set termguicolors
syntax on
" Set tab stuff
set tabstop=2
set shiftwidth=2
set expandtab
set softtabstop=2
" Enable line numbers
set number
set relativenumber
set cursorline
" Make cursorlinenum a different color
augroup colorAutoCmds
autocmd!
autocmd ColorScheme * highlight CursorLineNr cterm=bold guifg=#cba6f7
augroup END
set ignorecase
set smartcase
set hlsearch
set incsearch
" Set different cursor shapes depending on mode
let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"
augroup cursorCmds
au!
autocmd VimEnter * silent !echo -ne "\e[2 q"
augroup END
" Completion menu
"inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
"inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
"inoremap <expr> <cr> pumvisible() ? asyncomplete#close_popup() : "\<cr>"
set omnifunc=ale#completion#OmniFunc
nnoremap K <cmd>ALEHover<CR>
nnoremap <leader>gd <cmd>ALEGoToDefinition<CR>
nnoremap <leader>gr <cmd>ALEFindReferences<CR>
nnoremap <leader>ca <cmd>ALECodeAc
let g:ale_completion_enabled = 1
autocmd User lsp_setup call lsp#register_server({
\ 'name': 'nixd',
\ 'cmd': ['nixd'],
\ 'allowlist': ['nix'],
\ })
let g:ale_linters = {
\ 'nix': ['nixd'],
\}
let g:ale_fixers = {
\ 'nix': ['alejandra'],
\}
let g:ale_fix_on_save = 1

View File

@@ -0,0 +1,60 @@
{
"allow-trailing-commas": true,
"widgets": [
{
"type": "slider",
"edge": "right",
"position": "top",
"thickness": 30,
"length": "25%",
"margins": {
"top": "50%"
},
"border-width": 4,
"border-color": "#cba6f7ff",
"fg-color": "#cba6f7bb",
"bg-color": "#31324466",
"fg-text-color": "#11111bff",
"bg-text-color": "#bac2dedd",
"transition-duration": 100,
"redraw-only-on-internal-update": true,
"radius": 10, // corner radius
"obtuse-angle": 90, // in degrees(90~180). controls how much curve the widget has
"scroll-unit": 0.005,
"pinnable": false,
"preset": {
"type": "speaker",
"animation-curve": "Linear", // mute animation
"mute-text-color": "#f38ba8ff",
"mute-color": "#f38ba8bb",
},
},
{
"type": "slider",
"edge": "right",
"position": "top",
"thickness": 30,
"length": "25%",
"margins": {
"top": "25%"
},
"border-width": 4,
"border-color": "#f9e2afff",
"fg-color": "#f9e2afbb",
"bg-color": "#31324466",
"fg-text-color": "#11111bff",
"bg-text-color": "#bac2dedd",
"transition-duration": 100,
"redraw-only-on-internal-update": true,
"radius": 10, // corner radius
"obtuse-angle": 90, // in degrees(90~180). controls how much curve the widget has
"scroll-unit": 0.005,
"pinnable": false,
"preset": {
"type": "backlight",
"device": "intel_backlight", // this is the name of the device. Find it under `/sys/class/backlight/` It should be something like `nvidia_0`, `intel_0`, etc.
},
},
]
}

View File

@@ -0,0 +1,20 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.way-edges = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
way-edges
];
});
perSystem = {pkgs, ...}: {
packages.way-edges = inputs.wrappers.lib.wrapPackage ({...}: {
inherit pkgs;
package = pkgs.way-edges;
flags = {
"--config-path" = ./config.jsonc;
};
});
};
}

View File

@@ -0,0 +1,42 @@
{
moduleWithSystem,
inputs,
...
}: {
flake.nixosModules.waybar = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
waybar
];
});
perSystem = {pkgs, lib, ...}: {
packages.waybar = lib.warn "Waybar is deprecated and no longer maintained. Please use pacakges.quickshell instead" inputs.wrappers.wrappers.waybar.wrap {
inherit pkgs;
"style.css".path = ./style.css;
configFile.content = ''
{
"include": [
"${./modules.jsonc}"
],
"height": 20,
"margin": "3 6",
"reload_style_on_change": true,
"position": "top",
"modules-left": [
"custom/logo",
"hyprland/workspaces"
],
"modules-center": [
"mpris"
],
"modules-right": [
"network",
"bluetooth",
"custom/notifs",
"battery",
"clock"
]
}
'';
};
};
}

View File

@@ -0,0 +1,78 @@
{
"custom/logo": {
"format": ""
},
"mpris": {
"format": "{status_icon} {title} - {artist}",
"title-len": 50,
"artist-len": 20,
"status-icons": {
"playing": "",
"paused": ""
}
},
"network": {
"format": "󰤭",
"format-ethernet": "󰈀",
"format-wifi": "{icon}",
"format-icons": [
"󰤟",
"󰤢",
"󰤥",
"󰤨"
],
"format-alt": "{ipaddr} / {gwaddr}",
"tooltip-format": "{ifname} - {essid}"
},
"bluetooth": {
"format": "󰂲",
"format-connected": "󰂱",
"tooltip-format": "{status} - {device_alias}",
"on-click": "kitty --class otter --title otter-launcher -e sh -c 'sleep 0.05 && otter-launcher bl'"
},
"battery": {
"format": "{icon} {capacity}%",
"format-plugged": "󰂄 {capacity}%",
"format-charging": "󰂄 {capacity}%",
"states": {
"warning": 30,
"critical": 15
},
"format-icons": [
"",
"",
"",
""
]
},
"custom/notifs": {
"format": "",
"on-click": "kitty --class otter --title otter-launcher -e sh -c 'sleep 0.05 && otter-launcher dunst'"
},
"memory": {
"format": " {percentage}%",
"tooltip-format": "{used:0.1f}GiB, {swapUsed:0.1f}GiB Swap"
},
"cpu": {
"format": " {usage}%"
},
"clock": {
"interval": 1,
"format": "{:%T}",
"tooltip-format": "<tt><small>{calendar}</small></tt>",
"calendar": {
"mode" : "year",
"mode-mon-col" : 3,
"weeks-pos" : "right",
"on-scroll" : 1,
"format": {
"months": "<span color='#89b4fa'><b>{}</b></span>",
"days": "<span color='#eba0ac'><b>{}</b></span>",
"weeks": "<span color='#a6e3a1'><b>W{}</b></span>",
"weekdays": "<span color='#fab387'><b>{}</b></span>",
"today": "<span color='#cba6f7'><b><u>{}</u></b></span>"
}
},
}
}

View File

@@ -0,0 +1,158 @@
* {
font-family: "Fira Mono Nerd Font Propo";
font-size: 16px;
font-weight: bold;
min-height: 16px;
margin: 0;
padding: 0;
}
window#waybar {
background: transparent;
}
.module {
background-color: rgba(30, 30, 46, 0.8);
margin: 0 3px;
padding: 0 9px;
border-radius: 7px;
}
#custom-logo {
background-color: #cba6f7;
color: #1e1e2e;
font-size: 21px;
}
#workspaces {
padding: 3px 4px;
}
#workspaces button {
background-color: #585b70;
margin: 0 2px;
padding: 0 2px;
border-radius: 2px;
}
#workspaces button:first-child {
border-radius: 5px 2px 2px 5px;
margin: 0;
margin-right: 2px;
}
#workspaces button:last-child {
border-radius: 2px 5px 5px 4px;
margin: 0;
margin-left: 2px;
}
#workspaces button:only-child {
border-radius: 5px;
padding: 0 12px;
margin: 0 1px;
}
#workspaces button.active {
background-color: #b4befe;
color: #313244;
}
#mpris {
font-size: 14px;
transition:
color 0.5s,
background-color 0.5s;
}
#mpris.paused {
color: #f2cdcd;
}
#mpris.playing {
color: rgba(30, 30, 46, 0.8);
background-color: #ca9ee6;
}
#network {
background-color: #f38ba8;
color: #1e1e2e;
}
#bluetooth {
background-color: #fab387;
color: #1e1e2e;
}
#custom-notifs {
background-color: #f9e2af;
color: #1e1e2e;
}
#battery {
background-color: #a6e3a1;
color: #1e1e2e;
transition:
color 0.5s,
background-color 0.5s,
linear-gradient 0.4s;
}
#battery.warning {
color: #1e1e2e;
background: #f38ba8;
background: linear-gradient(
135deg,
rgba(243, 139, 168, 1) 0%,
rgba(166, 218, 149, 1) 65%,
rgba(166, 218, 149, 1) 100%
);
}
#battery.charging {
background-color: #40a02b;
background: #cba6f7;
background: linear-gradient(
135deg,
rgba(203, 166, 247, 1) 0%,
rgba(166, 218, 149, 1) 65%,
rgba(166, 218, 149, 1) 100%
);
}
#battery.plugged {
background-color: #40a02b;
background: #cba6f7;
background: linear-gradient(
135deg,
rgba(203, 166, 247, 1) 0%,
rgba(166, 218, 149, 1) 65%,
rgba(166, 218, 149, 1) 100%
);
}
#battery.critical {
color: #f38ba8;
}
#memory {
padding-right: 3px;
border-radius: 7px 0 0 7px;
margin-right: 0;
background-color: #89dceb;
color: #1e1e2e;
}
#cpu {
padding-left: 3px;
border-radius: 0 7px 7px 0;
margin-left: 0;
background-color: #89dceb;
color: #1e1e2e;
}
#clock {
background-color: #89b4fa;
color: #1e1e2e;
}

View File

@@ -0,0 +1,22 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.wlogout = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
wlogout
];
});
perSystem = {pkgs, ...}: {
packages.wlogout = inputs.wrappers.lib.wrapPackage ({...}: {
inherit pkgs;
package = pkgs.wlogout;
flags = {
"--css" = ./style.css;
"--layout" = ./layout;
"--buttons-per-row" = "5";
};
});
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

30
modules/features/wlogout/layout Executable file
View File

@@ -0,0 +1,30 @@
{
"label" : "lock",
"action" : "hyprlock",
"text" : "Lock",
"keybind" : "l"
}
{
"label" : "logout",
"action" : "hyprctl dispatch 'hl.dsp.exit()'" ,
"text" : "Logout",
"keybind" : "e"
}
{
"label" : "shutdown",
"action" : "systemctl poweroff",
"text" : "Shutdown",
"keybind" : "s"
}
{
"label" : "suspend",
"action" : "systemctl suspend",
"text" : "Sleep",
"keybind" : "u"
}
{
"label" : "reboot",
"action" : "systemctl reboot",
"text" : "Reboot",
"keybind" : "r"
}

View File

@@ -0,0 +1,73 @@
* {
background-image: none;
box-shadow: none;
}
window {
background-color: rgba(12, 12, 12, 0.05);
}
button {
border-radius: 0;
border-color: #cba6f7;
text-decoration-color: #ffffff;
color: #FFFFFF;
background-color: #313244;
border-style: solid none;
border-width: 4px;
background-repeat: no-repeat;
background-position: 50% 30%;
background-size: 75%;
}
button:first-child {
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
}
button:last-child {
border-top-right-radius: 10px;
border-bottom-right-radius: 10px;
}
#lock {
border-left-style: solid;
background-image: image(url("./icons/lock.png"));
}
#logout {
background-image: image(url("./icons/exit.png"));
}
#suspend {
background-image: image(url("./icons/slwwp.png"));
}
#shutdown {
background-image: image(url("./icons/power.png"));
}
#reboot {
border-right-style: solid;
background-image: image(url("./icons/reload.png"));
}
#lock:focus {
background-color: #f38ba8;
}
#logout:focus {
background-color: #fab387;
}
#shutdown:focus {
background-color: #a6e3a1;
}
#suspend:focus {
background-color: #f9e2af;
}
#reboot:focus {
background-color: #cba6f7;
}

View File

@@ -0,0 +1,26 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.woomer = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
woomer
];
});
perSystem = {
pkgs,
inputs',
...
}: {
packages.woomer = inputs.wrappers.lib.wrapPackage ({...}: {
inherit pkgs;
package = inputs'.woomer.packages.default;
flags = {
"--monitor" = "DP-1";
"--output" = "DP-1";
"--radius" = "2";
};
});
};
}

View File

@@ -0,0 +1,35 @@
{
moduleWithSystem,
inputs,
...
}: {
flake.nixosModules.wpaperd = moduleWithSystem ({self', ...}: {
environment.systemPackages = with self'.packages; [
wpaperd
];
});
perSystem = {pkgs, ...}: {
packages.wpaperd = let
config-file = builtins.toFile "config.toml" ''
[any]
path = "${./wallpapers}"
[HDMI-A-1]
path = "${./wallpapers/topo1.png}"
[DP-1]
path = "${./wallpapers/topo2.png}"
[DP-2]
path = "${./wallpapers/topo3.png}"
'';
in
inputs.wrappers.lib.wrapPackage ({...}: {
inherit pkgs;
package = pkgs.wpaperd;
flags = {
"--config" = config-file;
};
});
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,17 @@
{moduleWithSystem, ...}: {
flake.nixosModules.wshowkeys = moduleWithSystem ({
self',
pkgs,
...
}: let
lib = pkgs.lib;
in {
programs.wshowkeys = {
enable = true;
package = self'.packages.wshowkeys;
};
});
perSystem = {inputs', ...}: {
packages.wshowkeys = inputs'.wshowkeys.packages.default;
};
}

View File

@@ -0,0 +1,105 @@
console_title_template = '{{ .Shell }} in {{ .Folder }}'
version = 3
final_space = true
[secondary_prompt]
template = '❯❯ '
foreground = 'magenta'
background = 'transparent'
[transient_prompt]
template = '❯ '
background = 'transparent'
foreground_templates = ['{{if gt .Code 0}}red{{end}}', '{{if eq .Code 0}}magenta{{end}}']
[[blocks]]
type = 'prompt'
alignment = 'left'
newline = true
[[blocks.segments]] # Hostname
type = 'text'
style = 'plain'
template = '{{ if .Env.SSH_CLIENT }}<green>󰒋 {{.HostName}}</> <#7f849c>|</> {{ end }}'
[[blocks.segments]]
type = 'text'
style = 'plain'
template = '''
{{- if .Env.DEVSHELL_NAME -}}
{{- $parts := split "|" .Env.DEVSHELL_NAME -}}
{{- range $part := $parts -}}
{{- if $part -}}
{{- $sub := split "/" $part -}}
{{- if eq (len $sub) 2 -}}
<{{ index $sub "_1" }}>{{ index $sub "_0" }}</> <#7f849c>| </>
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
'''
[[blocks.segments]] # Python venv
type = 'text'
style = 'plain'
template = '{{ if .Env.VIRTUAL_ENV }}<yellow>🐍 venv</> <#7f849c>|</> {{ end }}'
[[blocks.segments]] # Nix shell indicator
type = 'text'
style = 'plain'
template = '{{ if and .Env.IN_NIX_SHELL (not .Env.DEVSHELL_NAME) }}<blue> nsh</> <#7f849c>|</> {{ end }}'
[[blocks.segments]]
template = '{{ .Path }}'
foreground = 'blue'
background = 'transparent'
type = 'path'
style = 'plain'
[blocks.segments.properties]
cache_duration = 'none'
style = 'full'
[[blocks.segments]]
template = ' {{ .HEAD }}{{ if or (.Working.Changed) (.Staging.Changed) }}<yellow> *</>{{ end }} <cyan>{{ if gt .Behind 0 }}󰁅{{ end }}{{ if gt .Ahead 0 }}{{ end }}</>'
foreground = 'green'
background = 'transparent'
type = 'git'
style = 'plain'
[blocks.segments.properties]
branch_icon = ''
cache_duration = 'none'
commit_icon = '@'
fetch_status = true
[[blocks]]
type = 'rprompt'
overflow = 'hidden'
[[blocks.segments]]
template = '{{ .FormattedMs }}'
foreground = 'yellow'
background = 'transparent'
type = 'executiontime'
style = 'plain'
[blocks.segments.properties]
cache_duration = 'none'
threshold = 5000
[[blocks]]
type = 'prompt'
alignment = 'left'
newline = true
[[blocks.segments]]
template = '❯'
background = 'transparent'
type = 'text'
style = 'plain'
foreground_templates = ['{{if gt .Code 0}}red{{end}}', '{{if eq .Code 0}}magenta{{end}}']
[blocks.segments.properties]
cache_duration = 'none'

View File

@@ -0,0 +1,113 @@
{
inputs,
moduleWithSystem,
...
}: {
flake.nixosModules.zsh = moduleWithSystem ({
pkgs,
self',
...
}: {
nixpkgs.overlays = [
(final: prev: {
zsh = self'.packages.zsh;
})
];
programs.zsh = {
enable = true;
enableCompletion = true;
enableBashCompletion = true;
autosuggestions.enable = true;
syntaxHighlighting.enable = true;
histSize = 10000;
};
users.defaultUserShell = pkgs.zsh;
});
perSystem = {
pkgs,
self',
lib,
flakeLocation,
...
}: {
packages = {
zsh = lib.warnIf (flakeLocation == "") "Flake Location is undefined. Are you building in the right directory?"
inputs.wrappers.wrappers.zsh.wrap {
inherit pkgs;
runtimePkgs = [pkgs.carapace pkgs.devenv pkgs.fzf];
zshAliases = {
ls = "${lib.getExe pkgs.lsd} -l";
v = lib.getExe self'.packages.nvim;
cat = lib.getExe pkgs.bat;
lg = lib.getExe pkgs.lazygit;
man = "man -P \"${lib.getExe pkgs.bat} -p\"";
nsh = "nix-shell -p";
nrs =
if flakeLocation != ""
then "( cd ${flakeLocation} && sudo nixos-rebuild switch --impure --flake . )"
else "echo 'Flake location not specified. Did you build with --impure?'";
vinix =
if flakeLocation != ""
then "nvim --cmd 'cd ${flakeLocation}'"
else "echo 'Flake location not specified. Did you build with --impure?'";
};
zshrc.content = ''
source ${./devenv.zsh}
if (( ''${+terminfo[smkx]} )) && (( ''${+terminfo[rmkx]} )); then
function zle-line-init() { echoti smkx }
function zle-line-finish() { echoti rmkx }
zle -N zle-line-init
zle -N zle-line-finish
fi
autoload -U compinit && compinit
export CARAPACE_BRIDGES='zsh,fish,bash,inshellisense' # optional
zstyle ':completion:*' format $'\e[2;37mCompleting %d\e[m'
source <(${lib.getExe pkgs.carapace} _carapace)
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
autoload -U select-word-style
select-word-style bash
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[OA" up-line-or-beginning-search
bindkey "^[OB" down-line-or-beginning-search
bindkey "^[[1;5C" forward-word
bindkey "^[[1;5D" backward-word
bindkey "^[[3;5~" kill-word
bindkey "^H" backward-kill-word
source <(${lib.getExe pkgs.fzf} --zsh)
setopt NO_CASE_GLOB
if command -v ${lib.getExe pkgs.nix-your-shell} > /dev/null; then
${lib.getExe pkgs.nix-your-shell} -- zsh | source /dev/stdin
fi
export EDITOR=nvim
eval "$(${lib.getExe self'.packages.ohMyPosh} init zsh)"
eval "$(${lib.getExe pkgs.devenv} hook zsh)"
typeset -ag precmd_functions
if (( ! ''${precmd_functions[(I)__devenv_reload_apply]} )); then
precmd_functions+=(__devenv_reload_apply)
fi
if (( ! ''${precmd_functions[(I)__devenv_restore_path]} )); then
precmd_functions+=(__devenv_restore_path)
fi
'';
};
ohMyPosh = inputs.wrappers.wrappers.oh-my-posh.wrap {
inherit pkgs;
configFile = ./config.toml;
};
};
};
}

View File

@@ -0,0 +1,82 @@
__devenv_reload_apply() {
if [ -n "$DEVENV_RELOAD_FILE" ] && [ -f "$DEVENV_RELOAD_FILE" ]; then
local output
output=$(DEVENV_RELOAD_FILE="$DEVENV_RELOAD_FILE" bash <<'RELOAD_BASH' 2>/dev/null
__devenv_ignored_var() {
case "$1" in
_*|PWD|OLDPWD|SHLVL|SHELL|SHELLOPTS|BASHOPTS|BASH_*|HISTCMD|HISTFILE)
return 0 ;;
PS1|PS2|PS3|PS4|PROMPT|PROMPT_COMMAND|PROMPT_DIRTRIM)
return 0 ;;
COMP_*|READLINE_*|MAILCHECK|COLUMNS|LINES|RANDOM|SECONDS|LINENO|EPOCHSECONDS|EPOCHREALTIME|SRANDOM)
return 0 ;;
STARSHIP_*|__fish*|DIRENV_*|nix_saved_*)
return 0 ;;
*) return 1 ;;
esac
}
__devenv_capture_env() { declare -p -x 2>/dev/null | LC_ALL=C sort; }
__devenv_serialize_diff() { gzip -c | base64 -w0; }
__devenv_deserialize_diff() { echo "$1" | base64 -d | gzip -d 2>/dev/null; }
__devenv_compute_diff() {
local before_file="$1" after_file diff_content
after_file=$(mktemp); diff_content=$(mktemp)
__devenv_capture_env > "$after_file"
local -A before_vars after_vars
while IFS= read -r line; do
[[ "$line" != declare\ -x\ * ]] && continue
local vardef="${line#declare -x }" var="${vardef%%=*}"
[[ -z "$var" ]] && continue
__devenv_ignored_var "$var" && continue
before_vars["$var"]="$line"
done < "$before_file"
while IFS= read -r line; do
[[ "$line" != declare\ -x\ * ]] && continue
local vardef="${line#declare -x }" var="${vardef%%=*}"
[[ -z "$var" ]] && continue
__devenv_ignored_var "$var" && continue
after_vars["$var"]="$line"
done < "$after_file"
for var in "${!before_vars[@]}"; do
[[ "${after_vars[$var]}" != "${before_vars[$var]}" ]] && echo "P:${before_vars[$var]}" >> "$diff_content"
done
for var in "${!after_vars[@]}"; do
if [[ -z "${before_vars[$var]+x}" ]]; then echo "N:$var" >> "$diff_content"
elif [[ "${after_vars[$var]}" != "${before_vars[$var]}" ]]; then echo "N:$var" >> "$diff_content"; fi
done
_DEVENV_DIFF=$(__devenv_serialize_diff < "$diff_content"); export _DEVENV_DIFF
rm -f "$after_file" "$diff_content"
}
__devenv_apply_reverse_diff() {
[[ -z "$_DEVENV_DIFF" ]] && return
local -A prev_vars
local diff_content; diff_content=$(__devenv_deserialize_diff "$_DEVENV_DIFF")
while IFS= read -r line; do
if [[ "$line" == P:declare\ * ]]; then
local decl="${line#P:}" var="${decl#declare -x }"; var="${var%%=*}"
prev_vars["$var"]=1; eval "export ${decl#declare -x }" 2>/dev/null
fi
done <<< "$diff_content"
while IFS= read -r line; do
if [[ "$line" == N:* ]]; then
local var="${line#N:}"
[[ -z "${prev_vars[$var]+x}" ]] && unset "$var"
fi
done <<< "$diff_content"
}
__devenv_apply_reverse_diff
_before=$(mktemp); __devenv_capture_env > "$_before"
if { : >/dev/tty; } 2>/dev/null; then _devenv_reload_out=/dev/tty; else _devenv_reload_out=/dev/null; fi
source "$DEVENV_RELOAD_FILE" >"$_devenv_reload_out" 2>"$_devenv_reload_out"
rm -f "$DEVENV_RELOAD_FILE"; unset _devenv_reload_out
__devenv_compute_diff "$_before"; rm -f "$_before"
export -p
RELOAD_BASH
)
if [ -n "$output" ]; then eval "$output"; fi
_DEVENV_PATH="$PATH"
fi
}
__devenv_restore_path() {
[ -n "$_DEVENV_PATH" ] && export PATH="$_DEVENV_PATH"
}

View File

@@ -0,0 +1,21 @@
{
self,
inputs,
...
}: {
flake.nixosConfigurations.HACKSTATION = inputs.nixpkgs.lib.nixosSystem {
modules = with self.nixosModules; [
desktop
hackstationConfiguration
amdDrivers
youtube
distcc
development
bottles
gaming
davinci
sddm-autologin
nix-ld
];
};
}

View File

@@ -0,0 +1,15 @@
{...}: {
flake.nixosModules.hackstationConfiguration = {pkgs, ...}: {
virtualisation.docker = {
enable = true;
};
networking = {
interfaces.enp5s0.wakeOnLan.enable = true;
hostName = "HACKSTATION";
};
environment.systemPackages = with pkgs; [
tor-browser
tor
];
};
}

View File

@@ -0,0 +1,16 @@
{
self,
inputs,
...
}: {
flake.nixosConfigurations.mobile02 = inputs.nixpkgs.lib.nixosSystem {
modules = with self.nixosModules; [
desktop
mobile02Configuration
intelDrivers
development
upower
music
];
};
}

View File

@@ -0,0 +1,11 @@
{
self,
inputs,
...
}: {
flake.nixosModules.mobile02Configuration = {...}: {
networking = {
hostName = "mobile02";
};
};
}

View File

@@ -0,0 +1,20 @@
{
self,
inputs,
...
}: {
flake.nixosConfigurations.mobile03 = inputs.nixpkgs.lib.nixosSystem {
modules = with self.nixosModules; [
desktop
mobile03Configuration
intelDrivers
development
thinkpadFanControl
upower
distcc
({...}: {
tabletSupport = true;
})
];
};
}

Some files were not shown because too many files have changed in this diff Show More