Compare commits

...
Sign in to create a new pull request.

122 commits
laptop ... main

Author SHA1 Message Date
1de15c45f2 super massive rewrite 2026-02-09 01:51:30 +10:00
a2192c9341 add cerulean compatability 2026-02-08 23:41:05 +10:00
e961180371 move hosts/packages -> packages 2026-02-08 20:22:39 +10:00
14193c05fb remove thefuck 2026-02-08 19:40:20 +10:00
833c05e31a Merge remote-tracking branch 'forge/main' 2026-02-08 19:35:28 +10:00
d5e36b8df8 im lazy 2026-02-08 18:56:06 +10:00
89ff7a1bcb Merge remote-tracking branch 'forge/main' 2026-02-08 17:55:05 +10:00
a1f4e812a5 add friends user to hyrule 2026-02-08 17:47:19 +10:00
9d6b398bae add discord 2026-02-08 17:47:11 +10:00
ae01c0b13e add nix-flatpak 2026-02-08 17:46:42 +10:00
4faa68debf remove subspace user 2026-02-08 17:46:34 +10:00
d78f6c2ffe remove random docs 2026-02-08 17:46:28 +10:00
e7fdc3af6b update dobutterfliescry-net upstream 2026-02-03 22:27:23 +10:00
502e4a82c0 migrate to dobutterfliescry.net 2026-02-03 12:25:10 +10:00
d643573659 add wl-screenrec, video-trimmer, cmake 2026-02-03 12:24:59 +10:00
42d2e37aed add clocktown host 2026-02-03 12:24:40 +10:00
e628d59c72 add helix glsl lsp 2026-01-31 11:07:09 +10:00
f1224c8cf8 add helix js/ts lsp 2026-01-31 10:57:59 +10:00
de526f42a0 progress input dobutterfliescry-net 2026-01-31 10:57:49 +10:00
47bc060da7 fix nginx bad root 2026-01-31 10:26:17 +10:00
e14ebf98ca add --show-flags and EXTRA_FLAGS to ./deploy 2026-01-31 10:14:46 +10:00
0eec0a9ade fix bad inputs 2026-01-31 09:57:24 +10:00
7e4959352a add dobutterfliescry.net input 2026-01-31 09:42:44 +10:00
964b3b596f ensure flake inputs follow 2026-01-31 09:42:35 +10:00
56af3c8919 split hyrule config 2026-01-31 08:38:36 +10:00
83e9a001db hyrule use bashistrans.nix 2026-01-31 08:37:39 +10:00
6b6ce26c66 move hyrule services to services/ 2026-01-31 08:36:33 +10:00
7d4353bffe major buff to the helix module 2026-01-31 08:36:10 +10:00
3a5e6dcbed ./deploy use --intend-to-add on call to git add 2026-01-29 14:40:18 +10:00
ba1a3fe07e helix module remove redudancy 2026-01-29 14:39:59 +10:00
51a67d039f add nix-unit 2026-01-29 14:39:15 +10:00
8c0f6606fa Merge remote-tracking branch 'forge/main' 2026-01-20 09:26:04 +10:00
676b3d367c support pipe-operators 2026-01-20 09:24:19 +10:00
2ef679f30f use dotnet module in rider module 2026-01-20 09:24:12 +10:00
aa17215adf prefer final: prev: convention
crywl module
2026-01-20 09:23:50 +10:00
9bbb8fa585 add dotnet module 2026-01-20 09:23:16 +10:00
5bae1d546a progress home-manager (hyrule) 2026-01-20 09:23:02 +10:00
c4464eeba2 remove ags 2026-01-20 09:22:48 +10:00
5153b1d54b ignore nib 2026-01-20 09:20:25 +10:00
bde4819307 helix support rust 2026-01-20 09:18:27 +10:00
51557ebd65 remove ags 2026-01-20 09:18:19 +10:00
1971078bf8 support pipe-operators on lolcathost 2026-01-20 09:18:03 +10:00
fecb0c441f progress home-manager 2026-01-20 09:17:55 +10:00
9c5af6a83d add more url.insteadOf identifiers for git 2026-01-07 10:34:46 +10:00
0c15fb7844 add hyprpicker + hyprshot to laptop 2026-01-07 10:34:46 +10:00
86bdcf2d39 is this necessary? 2026-01-07 10:34:46 +10:00
4bc40a1d37 i be gaming frfr 2026-01-07 10:34:46 +10:00
6439764717 (temp) remove ChameleonUltraGUI+FlipperZero 2026-01-07 10:34:46 +10:00
f0c7f565c3 remove flake.nix:inputs.ags 2025-11-01 13:21:55 +10:00
540fd9c2a9 begin migrating hyprland config to home-manager 2025-11-01 13:21:32 +10:00
a03ea35af7 begin working on my nib library <3 2025-11-01 12:27:00 +10:00
91afb32049 add speedtest-cli 2025-11-01 12:09:28 +10:00
8f7a725fd5 JetBrains Rider requires Chromium browser 2025-11-01 12:08:58 +10:00
8a14f7e2fc remove dwarf-fortress & mindustry 2025-10-24 23:46:17 +10:00
8f222f454a add vscode + extensions to lolcathost nixpkgs allowed unfree 2025-10-24 23:45:29 +10:00
ca3fd4093f fix ugly nixpkgs.config.allowUnfreePredicate 2025-10-24 23:44:56 +10:00
c8d3fe1e6b add tmux 2025-10-24 23:39:00 +10:00
e2f641e553 use pkgs-unstable.msbuild
pkgs.msbuild use .NET6 (marked insecure), pkgs-unstable.msbuild uses
.NET8
2025-10-24 17:31:23 +10:00
728f933f39 increase nix.settings.download-buffer-size 2025-10-24 17:25:15 +10:00
ffb9b35d46 clean rider install + progress to latest on pkgs-unstable 2025-10-24 17:24:58 +10:00
2fb9171d92 replace ags -> fuzzel
ags usage changed after flake.lock progression
2025-10-24 17:24:11 +10:00
11b4c920fc patch mbedtls_2 now labelled insecure
occurred due to flake.lock progression
2025-10-24 17:23:28 +10:00
09db1c47e1 progress flake inputs to latest 2025-10-24 17:22:27 +10:00
17807752e5 packaging JetBrains Rider (UNSTABLE) 2025-10-24 11:53:42 +10:00
46ed077813 open minecraft server port 25565 (myputer) 2025-10-24 11:52:46 +10:00
596fcd5389 add Tor Browser 2025-10-24 11:52:24 +10:00
fd48d6af9a add Mozilla Thunderbird 2025-10-24 11:52:08 +10:00
892a1ae877 add MicroTik WinBox 2025-10-24 11:51:49 +10:00
1ee0ba1a4c fix vscode plugins not whitelisted 2025-10-24 11:50:00 +10:00
63c1f112d4 (temp) hide chameleonultra+flipperzero to improve build time 2025-10-24 11:48:49 +10:00
ce3eb7a6d8 vscode requires an OS keyring daemon 2025-10-24 11:47:58 +10:00
1d54b41347 replace vscodium -> vscode 2025-10-24 11:47:20 +10:00
1600fd2885 fix bashistrans (myputer) 2025-10-24 11:46:08 +10:00
8e2aad53be customise vscodium 2025-10-24 11:45:00 +10:00
a29c66e35d add mako notification daemon 2025-10-24 11:44:02 +10:00
f51ac822e0 enable vscodium 2025-10-08 11:15:21 +10:00
78c75ea740 add NetCoreDbg for helix 2025-10-08 10:59:14 +10:00
c46d9665a1 fix conditional .gitconfig 2025-10-08 10:39:41 +10:00
d26b8af26f add work conditional .gitconfig 2025-10-07 12:50:38 +10:00
4e615703a6 i dont need this anymore 2025-10-06 21:21:28 +10:00
328c628291 (temp) add notes on screensharing 2025-10-06 21:19:53 +10:00
8ec227aa10 add cute lil banner 2025-10-06 21:19:37 +10:00
d094fbb26f helix now supports C# LSP 2025-10-06 21:19:26 +10:00
dc0ec2f3f1 Merge branch 'merge2' 2025-10-06 09:46:58 +10:00
2dde0450c4 add discord 2025-10-06 09:46:15 +10:00
2da0075992 add radare2, gdb, perf-tools 2025-10-06 09:46:15 +10:00
a04641fc9d (temp) disable hyrule's minecraft server 2025-10-06 09:44:34 +10:00
c05db67974 progress hyrule home-manager 2025-10-06 09:44:34 +10:00
5c955e5232 (attempt) package CrazyCraft void launcher for my partner lol 2025-10-06 09:44:34 +10:00
70ed4a9a38 add hosts/modules/bashistrans.nix 2025-10-06 09:30:18 +10:00
120b753882 (attempt) fix dbus service for bluetui
manually configure resolvd with CloudFlare's WARP+ DNS
2025-10-06 09:24:16 +10:00
3e1d106179 add pstree + lz4 2025-10-06 09:21:56 +10:00
f9df463872 add dotnet9 2025-10-06 09:21:03 +10:00
bf22bfbcf4 enable NIX_SHELL_PRESERVE_PROMPT 2025-10-06 09:18:26 +10:00
81c7c25c6f add hexyl, timg, and other 2025-09-26 23:18:45 +10:00
cb6f984065 add pkgs.moreutils 2025-09-24 13:30:20 +10:00
75751e3085 always install derivation "man" ouputs 2025-09-18 19:48:09 +10:00
c94e75bb02 mark all dev outputs for install 2025-09-03 11:13:13 +10:00
eaea98a362 add hyprsunset (its 3am and im going blind............) 2025-09-03 03:27:12 +10:00
a35cedeecb add haskell lsp + formatter 2025-09-03 03:26:36 +10:00
6fbaf7fe89 add haskell support 2025-09-03 00:37:55 +10:00
364efb25ea dbus sucks i wanna cry :( 2025-09-03 00:24:41 +10:00
eb02262ae6 add x86-manpages derivation (ISA manpages) 2025-08-31 23:27:08 +10:00
95bf9fe6ad add nasm pkg 2025-08-31 23:26:30 +10:00
a33e8a0147 provide nixpkgs-unstable to homemanager (myputer) 2025-08-31 23:26:08 +10:00
1f35c727ed progress home-manager 2025-08-31 23:25:25 +10:00
99a0adb621 add list syscalls script 2025-08-31 23:23:10 +10:00
db0a34ebbd ltrace/strace for lolcathost 2025-08-31 15:19:51 +10:00
484a8df77b Merge branch 'laptop' 2025-08-31 15:17:53 +10:00
98244e7ecf (test) openvas on myputer 2025-08-31 14:56:23 +10:00
186c0c741a add binary debug utils 2025-08-31 14:56:01 +10:00
7ecf75bef5 add hypr screenshot utility 2025-08-31 14:55:27 +10:00
dc12ab717b remove gamescope.desktop entry, add GE Proton 2025-08-31 14:54:59 +10:00
60a6b07c9d comment programs.fish.vendor.* 2025-08-12 21:11:38 +10:00
7069840beb add gwenview + libreoffice apps 2025-08-12 21:11:08 +10:00
63e8a31e7f add fish function for file name searching 2025-08-08 20:20:13 +10:00
7ab29bfe07 add custom huggingface_hub packages (learning from hf-cli's authentication workflow) 2025-08-08 20:15:44 +10:00
d68132b8fb make fish dotfiles more verbose + add gitignore function to generate .gitignore files 2025-08-08 20:14:52 +10:00
d3a642fafb add "box" script for managing temp directories 2025-08-08 20:13:51 +10:00
0129fe2b97 renamed TODO -> +.md 2025-08-08 14:08:50 +10:00
ee7e38e7ba add git aliases 2025-08-08 11:28:11 +10:00
0eeb94b65c re-add nimble to lang pkgs 2025-08-07 10:45:00 +10:00
83 changed files with 2587 additions and 3821 deletions

109
GUIDE.md
View file

@ -1,109 +0,0 @@
# The Nix Documentation Situation
The Nix documentation situation is notorious bad. It's difficult to find
a concise answer with detailed justification/explanation. And most people
(myself included) tend resort to the [ArchWiki](https://wiki.archlinux.org).
> [!NOTE]
> The [Nix documentation team](https://nixos.org/community/teams/documentation) has an incredibly difficult job.
Unlike the *centralised* [ArchWiki](https://wiki.archlinux.org), the Nix ecosystem
is incredibly large:
1. **Nix** (the package manager)
2. **Nix/NixLang** (the programming language)
3. **Nixpkgs** (the package repository)
4. **NixOS** (the linux distribution)
5. **Home-Manager** (user environment management)
6. **NUR** (Nix User Repository, like the AUR but Nix!)
7. *and **many** more...*
Often each project has its own website, wiki, styling, etc. There is tonnes
of information available online but its so hard to find it.
**Notable organisations:**
1. NixOS Foundation (*official organisation that maintains Nix/Nixpkgs/NixOS*)
2. Nix Community (*unofficial community providing infrastructure/hosting/visibility for projects*)
## About Me
I love and hate Nix simultaneously.
Originally *(circa 2023)* I used Windows 10/11 exclusively for programming.
But this is tedious and my friend started mentioning Arch Linux. So with their
help I formatted a spare SSD and began my journey.
But I **REALLY** like computers... I have servers, routers, 3 computers
actively powered in my bedroom, and *I believe* 8 laptops *currently* in my posession.
Documenting **every** change I make to a system and spending a week
setting up a device I don't really care about isn't sustainable.
And then *(circa October 2024)* I learnt about NixOS... And now life is "easy".
But learning Nix/NixLang/Nixpkgs/NixOS/Home-Manager/blah-blah-blah was exhausting.
So now I'll try to simplify this learning curve for other newbies **<3**
## Nix/NixOS How To
### NixOS Documentation
Using "the" NixOS wiki is surprisingly confusing (at least it was for me).
Why? Because there are multiple and you probably won't realise the difference.
**Main Wikis:**
> These are visually and structurally identical... And are both community run.
> But they're content does differ. [nixos.wiki] was created
> because ""[wiki.nixos.org] was too limiting with regards to wiki features".
1. [https://wiki.nixos.org] (the **official** NixOS wiki)
2. [https://nixos.wiki] (the **unofficial** user's wiki, community run)
**Other Resources:**
> [!TODO]
### Migrate to a Newer Version of Nixpkgs
```bash
# Determine the channel name you're using
nix-channel --list
nix-channel --remove <OLD_CHANNEL>
nix-channel --add <NEW_CHANNEL> # ie https://nixos.org/channels/nixos-25.05
nix-channel --update
# Now upgrade system profile (log to file in case of failure)
nixos-rebuild boot --upgrade | tee rebuild.log
```
## Security Implications
### NixOS Default Home Permissions
```bash
# Executing from $HOME
>>> mkdir example.d && ls -l example.d
-rw-r--r-- 1 me users 1 Jul 25 10:13 example.d
>>> echo > example.f && ls -l example.f
-rw-r--r-- 1 me users 1 Jul 25 10:15 example.f
## But these ignore facl?
>>> getfacl "$HOME"
# file: home/me
# owner: me
# group: users
user::rwx
group::---
other::---
```
Many commands default to permissions that ignore the file access control listl (file ACLs).
This is not a NixOS specific issue. However this isn't ideal from a security perspective.
The simplest solution is a recursive `chmod -R 600 ~` but there are plenty of files we
intentionally want to be different.
> [!TODO]
> Solution: Make a Nix/Home-Manager package allowing for control over folder permissions.
> SOlution: Also it should warn if any files owned by $USER have a 2
## Further Reading
### Finding New Things to Do
`man 5 configuration.nix` is incredibly useful
similar info can be found at https://mynixos.com/options
### For your curiosity
1. https://wiki.nixos.org/wiki/Firejail

33
TODO
View file

@ -1,33 +0,0 @@
## Next Up
0. Rename TODO -> TODO.md
1. Rename user "ae" to "cry" or "vps"
2. Add 404 page to nginx on hyrule
3. Add a user called "mirror" that stores important mirrors (inspiration: https://git.gay/mirror)
## TODO
SOON: fix having to keep specifying new sha256 for home-manager (where I fetchTarball for it)
Create a command palette accessible with MOD+P (MOD => Windows Key)
(ie make fullscreen, send to monitor, etc)
Boring stuff (ie work and uni should go on a separate user account)
on in some separate $HOME atleast
Is home-manager installed standalone? If so please remove that...
Rewrite the README.md file its all over the place (add more structure to the `docs` directory instead)
Add a MAC Changer module like
https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles/blob/main/nixos/mac-randomize.nix
Make each monitor's window styling slightly different (just for fun)
Research "input methods" ie https://wiki.archlinux.org/title/Input_method
Bind 5 workspaces per connected monitor.
Then use the command palette (discussed prior) to send to
a different workspace (ie because I currently use MOD+SHIFT+n
but if n>=10 then it doesnt work! hence we need a command palette!)
Can I run openvpn only for a specific proccess and its children?
then ie run qbittorrent (just in case the VPN isnt private)

View file

@ -1,371 +0,0 @@
# All hyprland configuration variables are listed (even niche ones)
# to save you the hassle. Reference: https://wiki.hypr.land/Configuring/Variables/
#
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/.config/hypr/myColors.conf
################
### MONITORS ###
################
# Programming:
monitor=eDP-1, highres@highrr, auto, 1.0
# Comfy:
#monitor=eDP-1, highres@highrr, auto, 1.5
###################
### MY PROGRAMS ###
###################
# See https://wiki.hyprland.org/Configuring/Keywords/
# Set programs that you use
$terminal = ghostty #rio
$fileManager = thunar
#$menu = wofi --show drun
$menu = ags -t "applauncher"
$colorpicker = hyprpicker | head -c 7 | wl-copy
#################
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
# exec-once = $terminal
# exec-once = nm-applet &
# exec-once = waybar & hyprpaper & firefox
exec-once = swww-daemon &
# TODO: or do I do `swww init` or `swww restore`?
# █▀▀ █▄░█ █░█   █░█ ▄▀█ █▀█
# ██▄ █░▀█ ▀▄▀   ▀▄▀ █▀█ █▀▄
# See https://wiki.hyprland.org/Configuring/Environment-variables/
#env = HYPRCURSOR_THEME,Bibata-Modern-Ice
env = HYPRCURSOR_SIZE,16
#env = XCURSOR_THEME,Bibata-Modern-Ice
env = XCURSOR_SIZE,16
env = QT_QPA_PLATFORM,wayland
env = QT_QPA_PLATFORMTHEME,qt5ct
env = XDG_MENU_PREFIX,arch-
# TODO: make this variable (not dependent on helix) in my flake
env = EDITOR,hx
env = TERMINAL,rio
# DEBUG: attempting to get screensharing working... (please god help me)
# REFERENCE: https://github.com/hyprwm/xdg-desktop-portal-hyprland/issues/251#issuecomment-2345631820
env = XDG_CURRENT_DESKTOP,Hyprland
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
#exec-once = dbus-update-activation-environment --systemd --all
#exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
# .__. .___ __..___. . . .___ .___. ._. __ __.
# [__] [__ (__ | |__| [__ | | / ` (__
# | | [___ .__) | | | [___ | _|_ \__. .__)
# Refer to https://wiki.hyprland.org/Configuring/Variables/
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
gaps_in = 12 # margin between windows
gaps_out = 25 # margin from windows to monitor edge
gaps_workspaces = 0 # margin between workspaces (stacks with gaps_out)
# float_gaps = 0 # gaps_out but for floating windows
border_size = 4
# https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.inactive_border = rgba(00000000)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
snap {
enabled = false
window_gap = 10
monitor_gap = 10
border_overlap = false
# respect_gaps = false
}
}
# https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration {
rounding = 20
rounding_power = 4.0 # Lp norm
border_part_of_window = true # consider border as part of its window
screen_shader = # path to custom GLSL fragment shader
# Window Transparency
active_opacity = 1.0
inactive_opacity = 0.95
fullscreen_opacity = 1.0 # fullscreened windows
# Inactive Window Dimming
dim_inactive = false
dim_strength = 0.5
dim_special = 0.2
dim_around = 0.4
# https://wiki.hyprland.org/Configuring/Variables/#blur
blur {
enabled = true
new_optimizations = true
xray = false # floating windows xray through tiling windows
ignore_opacity = true
# Blur Parameters
size = 8
passes = 1
noise = 0.0117 # default
contrast = 0.8916 # default
brightness = 0.8172 # default
vibrancy = 0.1696 # default
vibrancy_darkness = 0.0 # default
# Blurring For Specific Window Types
special = false # blur special windows
popups = false # blur popups
popups_ignorealpha = 0.2
input_methods = false
input_methods_ignorealpha = 0.2
}
shadow {
enabled = true
ignore_window = true # only render at edges (not behind)
range = 3
render_power = 1 # falloff rate
sharp = false # aka infinite shadow.render_power
offset = 0 0 # vec2
scale = 1.0
color = rgba(00000000)
color_inactive = rgba(000000ff) # defaults to shadow.color if unset
}
}
# https://wiki.hyprland.org/Configuring/Variables/#animations
animations {
enabled = yes, please :)
# Animation Declaration Format:
# "animation = NAME, ENABLE, SPEED, BEZIER [,STYLE]"
# SPEED: in ds (where 1ds = 100ms)
# Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = easeOutQuint,0.23,1,0.32,1
bezier = easeInOutCubic,0.65,0.05,0.36,1
bezier = linear,0,0,1,1
bezier = almostLinear,0.5,0.5,0.75,1.0
bezier = quick,0.15,0,0.1,1
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
#animation = windows, 1, 4.79, easeOutQuint
#animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsIn, 1, 4, linear, slide bottom
# animation = windowsOut, 1, 1.49, linear, popin 87%
animation = windowsOut, 1, 10, linear, popin
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 1.94, almostLinear, fade
animation = workspacesIn, 1, 1.21, almostLinear, fade
animation = workspacesOut, 1, 1.94, almostLinear, fade
}
# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/
# "Smart gaps" / "No gaps when only"
# uncomment all if you wish to use that.
# workspace = w[t1], gapsout:0, gapsin:0
# workspace = w[tg1], gapsout:0, gapsin:0
# workspace = f[1], gapsout:0, gapsin:0
# windowrulev2 = bordersize 0, floating:0, onworkspace:w[t1]
# windowrulev2 = rounding 0, floating:0, onworkspace:w[t1]
# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tg1]
# windowrulev2 = rounding 0, floating:0, onworkspace:w[tg1]
# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1]
# windowrulev2 = rounding 0, floating:0, onworkspace:f[1]
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
dwindle {
pseudotile = true # Master switch for pseudotiling. Enabling is bound to MOD + P in the keybinds section below
preserve_split = true # You probably want this
}
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hyprland.org/Configuring/Variables/#misc
misc {
#force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
disable_splash_rendering = true
}
#############
### INPUT ###
#############
# https://wiki.hyprland.org/Configuring/Variables/#input
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = false
}
}
# https://wiki.hyprland.org/Configuring/Variables/#gestures
gestures {
workspace_swipe = true
}
# Example per-device config
# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
#device {
# name = epic-mouse-v1
# sensitivity = -0.5
#}
###################
### KEYBINDINGS ###
###################
# See https://wiki.hyprland.org/Configuring/Keywords/
$MOD = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = $MOD, RETURN, exec, $terminal
bind = $MOD, E, exec, $fileManager
bind = $MOD, R, exec, $menu
bind = $MOD, H, exec, $colorpicker
bind = $MOD, F, fullscreen
bind = $MOD, V, togglefloating,
bind = $MOD, P, pseudo, # dwindle
bind = $MOD, J, togglesplit, # dwindle
bind = $MOD, C, killactive,
#bind = $MOD, M, exit,
# Move focus with MOD + arrow keys
bind = $MOD, left, movefocus, l
bind = $MOD, right, movefocus, r
bind = $MOD, up, movefocus, u
bind = $MOD, down, movefocus, d
# Switch workspaces with MOD + [0-9]
bind = $MOD, 1, workspace, 1
bind = $MOD, 2, workspace, 2
bind = $MOD, 3, workspace, 3
bind = $MOD, 4, workspace, 4
bind = $MOD, 5, workspace, 5
bind = $MOD, 6, workspace, 6
bind = $MOD, 7, workspace, 7
bind = $MOD, 8, workspace, 8
bind = $MOD, 9, workspace, 9
bind = $MOD, 0, workspace, 10
# Move active window to a workspace with MOD + SHIFT + [0-9]
bind = $MOD SHIFT, 1, movetoworkspace, 1
bind = $MOD SHIFT, 2, movetoworkspace, 2
bind = $MOD SHIFT, 3, movetoworkspace, 3
bind = $MOD SHIFT, 4, movetoworkspace, 4
bind = $MOD SHIFT, 5, movetoworkspace, 5
bind = $MOD SHIFT, 6, movetoworkspace, 6
bind = $MOD SHIFT, 7, movetoworkspace, 7
bind = $MOD SHIFT, 8, movetoworkspace, 8
bind = $MOD SHIFT, 9, movetoworkspace, 9
bind = $MOD SHIFT, 0, movetoworkspace, 10
# Example special workspace (scratchpad)
bind = $MOD, S, togglespecialworkspace, magic
bind = $MOD SHIFT, S, movetoworkspace, special:magic
# Scroll through existing workspaces with MOD + scroll
bind = $MOD, mouse_up, workspace, e-1
bind = $MOD, mouse_down, workspace, e+1
# Or with the keyboard
bind = $MOD SHIFT, left, workspace, e-1
bind = $MOD SHIFT, right, workspace, e+1
# Move/resize windows with MOD + LMB/RMB and dragging
bindm = $MOD, mouse:272, movewindow
bindm = $MOD, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
# Example windowrule v1
# windowrule = float, ^(kitty)$
# Example windowrule v2
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
# Ignore maximize requests from apps. You'll probably like this.
windowrulev2 = suppressevent maximize, class:.*
# Fix some dragging issues with XWayland
windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0

27
deploy
View file

@ -9,6 +9,7 @@ Options:
-f, --fresh Remove old content in the nixstore (good for debugging) -f, --fresh Remove old content in the nixstore (good for debugging)
-b, --bootloader Reinstall the bootloader -b, --bootloader Reinstall the bootloader
-r, --remote Locally build and remotely deploy Colmena hive -r, --remote Locally build and remotely deploy Colmena hive
--show-trace Show nix stack trace on error
-h, --help Show this message (^_^)" -h, --help Show this message (^_^)"
# delete all cached entries # delete all cached entries
@ -19,7 +20,8 @@ collect_garbage () {
rebuild_flake () { rebuild_flake () {
# make sure all changes are visible to nixos # make sure all changes are visible to nixos
git add . --verbose # (--intent-to-add tracks files but DOES NOT stage them)
git add . --intent-to-add --verbose
local FLAGS= local FLAGS=
if [ "$1" = "reinstall-bootloader" ]; then if [ "$1" = "reinstall-bootloader" ]; then
FLAGS="--install-bootloader" FLAGS="--install-bootloader"
@ -30,7 +32,7 @@ rebuild_flake () {
# LOG="$(mktemp /tmp/rebuild-XXXXXXXX)" # LOG="$(mktemp /tmp/rebuild-XXXXXXXX)"
LOG="./rebuild.log" LOG="./rebuild.log"
echo "[*] Logging to $LOG" echo "[*] Logging to $LOG"
sudo nixos-rebuild switch --flake . $FLAGS 2>&1 | tee "$LOG" sudo nixos-rebuild switch --flake . $FLAGS $EXTRA_FLAGS 2>&1 | tee "$LOG"
#nixos-rebuild build --flake .# --cores 8 -j 1 #nixos-rebuild build --flake .# --cores 8 -j 1
} }
@ -41,19 +43,22 @@ deploy_hive () {
git add . --verbose git add . --verbose
# Deploy to all Colmena hives # Deploy to all Colmena hives
colmena build --experimental-flake-eval colmena build --experimental-flake-eval $EXTRA_FLAGS
colmena apply --experimental-flake-eval colmena apply --experimental-flake-eval $EXTRA_FLAGS
# colmena apply --on hyrule --experimental-flake-eval # colmena apply --on hyrule --experimental-flake-eval
} }
# check which flags were given # check which flags were given
flag_fresh=false flag_fresh=false
flag_bootloader=false flag_bootloader=false
flag_remote=false
flag_trace=false
for flag in "$@"; do for flag in "$@"; do
case "$flag" in case "$flag" in
-r|--remote) -r|--remote)
deploy_hive flag_remote=true ;;
exit 0 ;; --show-trace)
flag_trace=true ;;
-f|--fresh) -f|--fresh)
flag_fresh=true ;; flag_fresh=true ;;
-b|--bootloader) -b|--bootloader)
@ -67,6 +72,16 @@ for flag in "$@"; do
esac esac
done done
EXTRA_FLAGS=""
if [ "$flag_trace" = true ]; then
EXTRA_FLAGS="$EXTRA_FLAGS --show-trace"
fi
if [ "$flag_remote" = true ]; then
deploy_hive
exit 0
fi
# delete cached items in nixstore # delete cached items in nixstore
if [ "$flag_fresh" = true ]; then if [ "$flag_fresh" = true ]; then
collect_garbage collect_garbage

View file

@ -1,25 +0,0 @@
## Users
#### me
My main personal account, used on my PC and laptop.
Contains a hyprland graphical environment by default.
#### ae
Primary account on my servers. Contains the bare
essentials for my work, no graphical environment.
#### friends
A simple account I let me friends connect to.
Limited functionality, mostly just for letting
them test small things or for giving them files.
## Setup Guide
##### Adding a New Server
Enable an ssh server on the remote host, then on the
local machine set `.ssh/config` to have a profile for
your desired host and have a key pair that's authorised
to your desired user.
NOTE: these keys must have permission 600 (only readable/writable by you)

View file

@ -1,67 +0,0 @@
This file will document what features I believe I need
for NixOS to be a good development environment.
Issues I've encountered:
- [X] Audio not working
- [X] Tesseract is a pain in the ass to setup on Nix
- [ ] ags no longer supports `-t` flag, so applauncher won't work, requires switching to Astral
- [ ] script to enable/disable passwordless sudo
- [X] Move Emile.Vault to new vault (I lost the password...)
- [X] Add a simple and ugly bar
- [ ] Install powertop (funny name) for monitoring power usage by processes
- [ ] Try to make my battery life bettery
- [ ] Apply for JetBrains student license
- [ ] JetBrains Rider and VSCodium for C#
2. Imperative development environment behind NixOS (declarative),
similar to python's virtualenv but for the entirety of my system.
- [X] Call my wishlist command "subspace (highway)" (Scott Pilgrim reference)
- [ ] Create a GitHub profile readme like this persons:
https://github.com/yuyudhn
- [ ] Set a new GitHub profile picture (like github:@Vendicated)
artists credit: https://dotpict.net/users/1598051
- [ ] Change GitHub location to /dev/zero, /dev/null, www, World Wide Web, etc
- [ ] Clean up my GitHub profile (only have things I'm proud of)
- [X] Put a template website on my VPS
- [ ] Put a neoweb-esque webiste on my VPS
- [ ] Host a blog on my VPS
- [ ] Clean laptop and PC, there's tons of unnecessary files and documents now
- [ ] Clean nixdots repo, start modularising it ^_^
- [ ] Disable `allowUnfree` in nixdots everywhere, if a program needs it then they
can `mkForce` override it
- [X] Add LSP for Nix in helix
- [ ] Make a way for me to put my laptop in a low power state, doing very specific actions like:
1. disabling LSP use by default temporarily
- [ ] Add https://github.com/levnikmyskin/hyprland-virtual-desktops
TODO:
- [X] make btop theming declarative
- [X] Merge laptop and PC dotfiles repos
- [ ] declaratively install themes for gitkraken using home-manager
Cool Technologies:
- wishlist (by charmbracelet)
- Vaultwarden server + Keyguard client
- devbox
Random Idea List:
- [ ] powertop is cool but it's outdated and ugly, make a prettier one with charmbracelet's tui library
and call it powerbtm lmao
- [ ] Blog Post: a modern alternative to the suckless philosphy,
why GNU keeps failing cause their programs are amazing but
aren't designed for humans. suckless programs are excellent
too when writing shell scripts, but they suck in dev environments.
The solution is to gamify our code and focus on aesthetics
and "ergonomics" (usability) like what CharmBracelet does

View file

@ -1,5 +0,0 @@
180GB of disk space were used by my system which seemed absurd. Running the NixOS
garbage collector only removed 7GB. The rest was found via:
`du -hs ./.local/share/Games/drive_c/Program\ Files\ \(x86\)/Steam/dumps/reports/*`
tldr: there were 2714 30MB crash report files generated every minute of May 2nd 2025 (10 days ago)
SOLUTION: delete them all and hope it doesn't happen again

View file

@ -1,91 +0,0 @@
Get Utilities:
1. httpie
2. curlie
3. zoxide
4. doggo
1. Get helix editor
2. Custom helix
3. Complete helix tutorial
Get nixcord working
Get thunar working
Set a GTK theme & icon theme
Get better wallpapers
Get hyprcursor working with Bibata-Modern-Ice
Get a GRUB theme working
Get SDDM and a theme working
Make a custom hyprlock screen
Get AGS working
Make an applauncher in AGS
Remove hyprland splash screen on init
Made lolcathost home modular
Overtime just install more programs that I need regularly: ie
- btop/htop/etc
Get GTK Bibata Cursors to be the same size as my system cursor (NOT SURE WHAT I DID...)
Get waybar (or another bar) working
Get a QT theme
Fix pipewire audio sometimes working and sometimes not :(
Bind new terminal to SUPER+Enter instead of SUPER+Q
Join Rio Terminal's discord and ask if they support nerdfonts or if I'm doing something wrong
Change Dell loading screen (Boot Graphics Resource Table, aka BGRT)
Fix: your 131072x1 screen size is bogus. expect trouble
Search for all "TODO" items in my nix dotfiles
Push nixdots to github
Check out the Ekala Project (I joined their discord server)
Create a program that enables/disables passwordless sudo access
(add to github too)
Learn to package my own home-manager modules
Ideal Features:
1. AI assistant
2. searching can also be used to calculate stuff (like I do on my iPad)
Fork nixcord and fix documentation (the installation is confusing)
But firstly the first code snippet is wrong...
```nix
inputs.nixcord = {
url = "github:kaylorben/nixcord"
};
```
Should actually be
```nix
inputs.nixcord = {
url = "github:kaylorben/nixcord"; # dont forget the semicolon
};
```

View file

@ -1,3 +0,0 @@
1. Create more themes for my applauncher
2. Create more themes for hyprlock
check out: https://github.com/MrVivekRajan/Hyprlock-Styles

View file

@ -1,12 +0,0 @@
Godlike
https://github.com/end-4/dots-hyprland
Gorgeous
https://github.com/prasanthrangan/hyprdots
Very nice
https://github.com/linuxmobile/hyprland-dots
I love their hyprpanel!
https://www.reddit.com/r/unixporn/comments/1ha3mjw/hyprlandnixos_is_the_pretty_ucking_solid_i_love/

View file

@ -1,2 +0,0 @@
Building specific parts of a NixOS system
https://nixos.org/manual/nixos/stable/#sec-building-parts

345
flake.lock generated
View file

@ -1,55 +1,85 @@
{ {
"nodes": { "nodes": {
"ags": { "cerulean": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs", "deploy-rs": "deploy-rs",
"systems": "systems" "mix": "mix",
"nib": "nib",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-unstable": [
"nixpkgs-unstable"
],
"systems": [
"systems"
]
}, },
"locked": { "locked": {
"lastModified": 1728326430, "lastModified": 1770552327,
"narHash": "sha256-tV1ABHuA1HItMdCTuNdA8fMB+qw7LpjvI945VwMSABI=", "narHash": "sha256-cVVPdC650MRP4tMSB9EcECUpc0U4HWSZzoQnpEHH0uE=",
"owner": "Aylur", "path": "/home/me/agribit/nexus/Cerulean",
"repo": "ags", "type": "path"
"rev": "60180a184cfb32b61a1d871c058b31a3b9b0743d", },
"original": {
"path": "/home/me/agribit/nexus/Cerulean",
"type": "path"
}
},
"deploy-rs": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs": "nixpkgs",
"utils": "utils"
},
"locked": {
"lastModified": 1766051518,
"narHash": "sha256-znKOwPXQnt3o7lDb3hdf19oDo0BLP4MfBOYiWkEHoik=",
"owner": "serokell",
"repo": "deploy-rs",
"rev": "d5eff7f948535b9c723d60cd8239f8f11ddc90fa",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "Aylur", "owner": "serokell",
"repo": "ags", "repo": "deploy-rs",
"type": "github" "type": "github"
} }
}, },
"colmena": { "dobutterfliescry-net": {
"inputs": { "inputs": {
"flake-compat": "flake-compat", "nixpkgs": [
"flake-utils": "flake-utils", "nixpkgs"
"nix-github-actions": "nix-github-actions", ],
"nixpkgs": "nixpkgs_2", "nixpkgs-unstable": [
"stable": "stable" "nixpkgs-unstable"
],
"systems": [
"systems"
]
}, },
"locked": { "locked": {
"lastModified": 1734374287, "lastModified": 1770316708,
"narHash": "sha256-rINodqeUuezuCWOnpJgrH7u9vJ86fYT+Dj8Mu8T/IBc=", "narHash": "sha256-i9oEi2PUIZfp+73ZvQE/Ze0aCEV3y3+vvaJ/ZmAe3bw=",
"owner": "zhaofengli", "ref": "refs/heads/main",
"repo": "colmena", "rev": "955746af205e2a94a8e0798a911941da9c5af779",
"rev": "47b6414d800c8471e98ca072bc0835345741a56a", "revCount": 117,
"type": "github" "type": "git",
"url": "https://forge.dobutterfliescry.net/cry/site"
}, },
"original": { "original": {
"owner": "zhaofengli", "type": "git",
"repo": "colmena", "url": "https://forge.dobutterfliescry.net/cry/site"
"rev": "47b6414d800c8471e98ca072bc0835345741a56a",
"type": "github"
} }
}, },
"flake-compat": { "flake-compat": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1650374568, "lastModified": 1733328505,
"narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"owner": "edolstra", "owner": "edolstra",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "b4a34015c698c7793d592d66adbab377907a2be8", "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -58,31 +88,50 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils": { "flake-compat_2": {
"locked": { "locked": {
"lastModified": 1659877975, "lastModified": 1733328505,
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"owner": "numtide", "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"repo": "flake-utils", "revCount": 69,
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", "type": "tarball",
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1768135262,
"narHash": "sha256-PVvu7OqHBGWN16zSi6tEmPwwHQ4rLPU9Plvs8/1TUBY=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "80daad04eddbbf5a4d883996a73f3f542fa437ac",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "numtide", "owner": "hercules-ci",
"repo": "flake-utils", "repo": "flake-parts",
"type": "github" "type": "github"
} }
}, },
"grub2-themes": { "grub2-themes": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs_3" "nixpkgs": [
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1730004881, "lastModified": 1757136219,
"narHash": "sha256-8xVIqIW25o2uCL0fxAmP4Sj9sdebarQXmd1+64yMe8o=", "narHash": "sha256-tKU+vq34KHu/A2wD7WdgP5A4/RCmSD8hB0TyQAUlixA=",
"owner": "vinceliuice", "owner": "vinceliuice",
"repo": "grub2-themes", "repo": "grub2-themes",
"rev": "42c232dfb46bf93c17506cbc1a574e5e89b5e09f", "rev": "80dd04ddf3ba7b284a7b1a5df2b1e95ee2aad606",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -91,50 +140,124 @@
"type": "github" "type": "github"
} }
}, },
"nix-github-actions": { "mix": {
"inputs": { "inputs": {
"nib": [
"cerulean",
"nib"
]
},
"locked": {
"lastModified": 1768525804,
"narHash": "sha256-jlpNb7Utqfdq2HESAB1mtddWHOsxKlTjPiLFRLd35r8=",
"owner": "emilelcb",
"repo": "mix",
"rev": "617d8915a6518a3d4e375b87c50ae34d9daee6c6",
"type": "github"
},
"original": {
"owner": "emilelcb",
"repo": "mix",
"type": "github"
}
},
"nib": {
"inputs": {
"systems": [
"cerulean",
"systems"
]
},
"locked": {
"lastModified": 1768472076,
"narHash": "sha256-bdVRCDy6oJx/CZiyxkke783FgtBW//wDuOAITUsQcNc=",
"owner": "emilelcb",
"repo": "nib",
"rev": "42ac66dfc180a13af1cc8850397db66ec5556991",
"type": "github"
},
"original": {
"owner": "emilelcb",
"repo": "nib",
"type": "github"
}
},
"nix-flatpak": {
"locked": {
"lastModified": 1767983141,
"narHash": "sha256-7ZCulYUD9RmJIDULTRkGLSW1faMpDlPKcbWJLYHoXcs=",
"owner": "gmodena",
"repo": "nix-flatpak",
"rev": "440818969ac2cbd77bfe025e884d0aa528991374",
"type": "github"
},
"original": {
"owner": "gmodena",
"ref": "v0.7.0",
"repo": "nix-flatpak",
"type": "github"
}
},
"nixcord": {
"inputs": {
"flake-compat": "flake-compat_2",
"flake-parts": "flake-parts",
"nixpkgs": [ "nixpkgs": [
"colmena",
"nixpkgs" "nixpkgs"
] ]
}, },
"locked": { "locked": {
"lastModified": 1729742964, "lastModified": 1770365342,
"narHash": "sha256-B4mzTcQ0FZHdpeWcpDYPERtyjJd/NIuaQ9+BV1h+MpA=", "narHash": "sha256-jV5tAs67HSBWz/ePEp1eyoUK3Lqfc1fEAvt2wC6reFc=",
"owner": "nix-community", "owner": "FlameFlag",
"repo": "nix-github-actions", "repo": "nixcord",
"rev": "e04df33f62cdcf93d73e9a04142464753a16db67", "rev": "51db830336715209a4a213aa985f4d405ff0be69",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "FlameFlag",
"repo": "nix-github-actions", "repo": "nixcord",
"type": "github" "type": "github"
} }
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1725634671, "lastModified": 1743014863,
"narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", "narHash": "sha256-jAIUqsiN2r3hCuHji80U7NNEafpIMBXiwKlSrjWMlpg=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", "rev": "bd3bac8bfb542dbde7ffffb6987a1a1f9d41699f",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "NixOS", "owner": "NixOS",
"ref": "nixos-unstable", "ref": "nixpkgs-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs-lib": {
"locked": {
"lastModified": 1761114652,
"narHash": "sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d+dAiC3H+CDle4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "01f116e4df6a15f4ccdffb1bcd41096869fb385c",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1753939845, "lastModified": 1770197578,
"narHash": "sha256-K2ViRJfdVGE8tpJejs8Qpvvejks1+A4GQej/lBk5y7I=", "narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "94def634a20494ee057c76998843c015909d6311", "rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -146,43 +269,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1734119587, "lastModified": 1770536720,
"narHash": "sha256-AKU6qqskl0yf2+JdRdD0cfxX4b9x3KKV5RqA6wijmPM=", "narHash": "sha256-pbmbaQUuoG+v37b91lqcNcz05YUvVif7iWjIx9lF8R4=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "3566ab7246670a43abd2ffa913cc62dad9cdf7d5", "rev": "3c64ab24b22579c833895b6030c9563837e41a70",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1730808093,
"narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c1a390f74b2c93f69a6805142f11a215a689cec1",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "master",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1752620740,
"narHash": "sha256-f3pO+9lg66mV7IMmmIqG4PL3223TYMlnlw+pnpelbss=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "32a4e87942101f1c9f9865e04dc3ddb175f5f32e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -194,41 +285,61 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"ags": "ags", "cerulean": "cerulean",
"colmena": "colmena", "dobutterfliescry-net": "dobutterfliescry-net",
"grub2-themes": "grub2-themes", "grub2-themes": "grub2-themes",
"nixpkgs": "nixpkgs_4", "nix-flatpak": "nix-flatpak",
"nixpkgs-unstable": "nixpkgs-unstable" "nixcord": "nixcord",
} "nixpkgs": "nixpkgs_2",
}, "nixpkgs-unstable": "nixpkgs-unstable",
"stable": { "systems": "systems_2"
"locked": {
"lastModified": 1730883749,
"narHash": "sha256-mwrFF0vElHJP8X3pFCByJR365Q2463ATp2qGIrDUdlE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "dba414932936fde69f0606b4f1d87c5bc0003ede",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
} }
}, },
"systems": { "systems": {
"locked": { "locked": {
"lastModified": 1689347949, "lastModified": 1681028828,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems", "owner": "nix-systems",
"repo": "default-linux", "repo": "default",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-systems", "owner": "nix-systems",
"repo": "default-linux", "repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github" "type": "github"
} }
} }

146
flake.nix
View file

@ -1,98 +1,106 @@
{ {
description = "Emile's Nix Dotfiles"; description = "im gonna cry again ;-;";
inputs = { inputs = {
systems.url = "github:nix-systems/default";
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
#home-manager = { home-manager = {
# url = "github:nix-community/home-manager"; url = "github:nix-community/home-manager/release-25.05";
# inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
#}; };
grub2-themes.url = "github:vinceliuice/grub2-themes"; cerulean = {
# url = "github:emilelcb/Cerulean";
url = "/home/me/agribit/nexus/Cerulean";
inputs = {
systems.follows = "systems";
nixpkgs.follows = "nixpkgs";
nixpkgs-unstable.follows = "nixpkgs-unstable";
};
};
ags.url = "github:Aylur/ags"; nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.7.0";
grub2-themes = {
url = "github:vinceliuice/grub2-themes";
inputs.nixpkgs.follows = "nixpkgs";
};
colmena.url = "github:zhaofengli/colmena/?rev=47b6414d800c8471e98ca072bc0835345741a56a"; nixcord = {
url = "github:FlameFlag/nixcord";
inputs.nixpkgs.follows = "nixpkgs";
};
dobutterfliescry-net = {
url = "git+https://forge.dobutterfliescry.net/cry/site";
inputs = {
nixpkgs.follows = "nixpkgs";
nixpkgs-unstable.follows = "nixpkgs-unstable";
systems.follows = "systems";
};
};
}; };
outputs = { outputs = {
self, cerulean,
nixpkgs, home-manager,
nixpkgs-unstable,
grub2-themes, grub2-themes,
colmena,
... ...
} @ inputs: let }: let
groups = {
cryde = {}; # oh frick i cried again
server = {};
};
in
cerulean.mkNexus ./. {
nexus = {
inherit groups;
overlays = import ./overlays;
nodes = {
# my laptop <3 :3
lolcathost = {
system = "x86_64-linux"; system = "x86_64-linux";
groups = [groups.cryde];
pkgs = import nixpkgs { extraModules = [
inherit system; home-manager.nixosModules.default
config = {
allowUnfree = false; # sanity check
};
};
pkgs-unstable = import nixpkgs-unstable {
inherit system;
config = {
allowUnfree = true; # TODO: bandaid solution... (for minecraft-server)
};
};
# TODO: come back to this its really cool
# this is just something I'm experimenting with
# PROJECT_ROOT = builtins.toString ./.;
in {
devShells."x86_64-linux".default = pkgs.mkShell {
shell = "${pkgs.bash}/bin/bash";
packages = with pkgs; [
# ./script/* dependencies
mkpasswd
];
};
nixosConfigurations = {
# i be on my puter fr
myputer = nixpkgs.lib.nixosSystem {
# nix passes these to every single module
specialArgs = {inherit inputs pkgs-unstable;};
modules = [
./hosts/myputer
grub2-themes.nixosModules.default grub2-themes.nixosModules.default
]; ];
}; };
# my laptop 0w0 # i be on my puter frfr
lolcathost = nixpkgs.lib.nixosSystem { myputer = {
specialArgs = {inherit inputs pkgs-unstable;}; system = "x86_64-linux";
groups = [groups.cryde];
modules = [ extraModules = [
./hosts/lolcathost home-manager.nixosModules.default
grub2-themes.nixosModules.default grub2-themes.nixosModules.default
]; ];
}; };
};
# remote deployment to my servers!! # courtesy of aurora <3
colmenaHive = colmena.lib.makeHive { butterfly = {
meta = {
nixpkgs = pkgs;
specialArgs = {inherit pkgs-unstable;};
# set nixpkgs per server
nodeNixpkgs = {
hyrule = import nixpkgs {
system = "x86_64-linux"; system = "x86_64-linux";
config.allowUnfree = false; groups = [groups.server];
}; deploy.ssh.host = "dobutterfliescry.net";
};
}; };
# meine vps # pls dont sue me im broke
hyrule = import ./hosts/hyrule; hyrule = {
system = "x86_64-linux";
groups = [groups.server];
deploy.ssh.host = "hyrule.dobutterfliescry.net";
};
# call me a statistician the way she spreads in my sheets
matcha = {
system = "x86_64-linux";
groups = [groups.server];
deploy.ssh.host = "bedroom.dobutterfliescry.net";
};
};
}; };
}; };
} }

140
groups/cryde/default.nix Normal file
View file

@ -0,0 +1,140 @@
{
inputs,
pkgs,
config,
...
}: {
imports = [
./programs.nix
../../hosts/modules/bashistrans.nix
../../hosts/modules/wm/hyprland.nix
../../hosts/modules/steam.nix
../../hosts/modules/obsidian.nix
inputs.nix-flatpak.nixosModules.nix-flatpak
];
boot.loader.grub2-theme = {
enable = true;
# GitHub: vinceliuice/grub2-themes
theme = "whitesur"; # stylish, vimix, or whitesur
footer = true;
customResolution = "1920x1080";
};
services = {
# Set display manager (login screen)
displayManager = {
# sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects
sddm = {
enable = true;
wayland.enable = true; # experimental
theme = "corners";
};
defaultSession =
"hyprland"
+ (
if config.programs.hyprland.withUWSM == true
then "-uwsm"
else null
);
};
tumbler.enable = true; # Thunar image thumbnail support
gvfs.enable = true; # Thunar mount, trash, and other functionality
};
programs = {
zsh.enable = true;
fish.enable = true;
nix-ld.enable = true;
neovim = {
enable = true;
defaultEditor = true;
viAlias = true;
vimAlias = true;
configure = {
customRC = ''
set number
set tabstop=4
set shiftwidth=4
'';
};
};
# Thunar also uses: `services.tumbler` & `services.gvfs`
thunar = {
enable = true;
plugins = with pkgs.xfce; [
thunar-volman # for removable drives (ie USBs)
thunar-archive-plugin # create and extract archives
thunar-media-tags-plugin # change metadata for media files
];
};
# mozilla's email client
thunderbird.enable = true;
};
# ----- FONTS -----
fonts = {
enableDefaultPackages = true; # no clue what this line does tbh
packages = with pkgs;
[
geist-font # for my hyprlock theme
# texlive maintains a noto-emoji flake
texlivePackages.noto-emoji
]
++ builtins.filter lib.attrsets.isDerivation (
builtins.attrValues pkgs.nerd-fonts
);
# TODO: change my default fonts
fontconfig = {
defaultFonts = {
serif = ["Geist"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font
sansSerif = ["Geist"];
monospace = ["Cousine"];
emoji = ["Noto Emoji"];
};
};
};
# ---- ENVIRONMENT VARIABLES ----
environment = {
sessionVariables = {
# Hint Electrons apps to use Wayland
NIXOS_OZONE_WL = "1";
};
systemPackages = with pkgs; [
(callPackage ../sddm-theme-corners.nix {}).sddm-theme-corners
# dependencies for my sddm theme:
# XXX: add these as a buildInput
pkgs.libsForQt5.qt5.qtgraphicaleffects
];
};
# ------- USERS -------
users = {
users = {
# literally me fr (personal account)
me = {
isNormalUser = true;
extraGroups = ["wheel" "netdev" "docker"];
shell = pkgs.bash;
packages = with pkgs; [
firefox
nitch
starfetch
colmena-latest
gitkraken
];
};
};
};
}

27
groups/cryde/programs.nix Normal file
View file

@ -0,0 +1,27 @@
{pkgs, ...}: {
# ---- SYSTEM PACKAGES -----
environment.systemPackages = with pkgs; [
# User Environment
swww
helvum
easyeffects
pavucontrol
ani-cli
bluetui
wl-clipboard # clipboard for wayland
hyprpicker # color picker
hyprshot # screenshot utility
wl-screenrec # screen recording utility
qbittorrent # torrenting
signal-desktop
kdePackages.gwenview # image viewer
video-trimmer
# Games
prismlauncher # minecraft
upkgs.olympus # celeste
discord
discordo
ekphos
];
}

137
groups/cryos/default.nix Normal file
View file

@ -0,0 +1,137 @@
{
pkgs,
lib,
...
}: {
imports = [
./programs.nix
];
nixpkgs.config.allowUnfreePredicate = let
whitelist = with pkgs;
map lib.getName [
discord
steam
steamcmd
steam-unwrapped
winbox
obsidian
gitkraken
];
in
pkg: builtins.elem (lib.getName pkg) whitelist;
boot.loader = {
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot/efi";
};
grub = {
efiSupport = true;
device = "nodev";
# useOSProber = true;
};
};
# Enable initrd hook for virtual console customisation
# aka cool colours when bootting yay!!
console = {
enable = true;
earlySetup = true; # initrd pre hook
keyMap = "us";
font = "Lat2-Terminus16";
# ANSI 24-bit color definitions (theme: dracula)
colors = [
"21222c"
"ff5555"
"50fa7b"
"f1fa8c"
"bd93f9"
"ff79c6"
"8be9fd"
"f8f8f2"
"6272a4"
"ff6e6e"
"69ff94"
"ffffa5"
"d6acff"
"ff92df"
"a4ffff"
"ffffff"
];
};
hardware = {
graphics = {
enable = true;
enable32Bit = true;
};
bluetooth = {
enable = true;
powerOnBoot = true;
};
};
virtualisation.docker.enable = true;
services = {
# systemd-resolved provides network name resolution
# to local processes via a D-Bus interface.
resolved = {
enable = true;
dnssec = "true";
domains = ["~."];
# Use CloudFlare's WARP+ 1.1.1.1 DNS service
fallbackDns = [
"1.1.1.1#one.one.one.one"
"1.0.0.1#one.one.one.one"
];
dnsovertls = "true";
};
# Multimedia Framework
# With backwards compatability for alsa/pulseaudio/jack
pipewire = {
enable = true;
audio.enable = true;
wireplumber.enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
};
security = {
rtkit.enable = true; # I *think* this is for pipewire
sudo.wheelNeedsPassword = lib.mkDefault true;
};
# ---- ENVIRONMENT VARIABLES ----
environment = {
# always install "dev" derivation outputs
extraOutputsToInstall = ["dev" "man"];
sessionVariables = {
# folder names with capitalisation look awful!
XDG_DOWNLOAD_DIR = "$HOME/downloads";
};
};
documentation = {
enable = true;
doc.enable = true; # install /share/doc packages
man.enable = true; # install manpages
info.enable = true; # install GNU info
dev.enable = true; # install docs intended for developers
nixos = {
enable = true; # install NixOS documentation (ie man -k nix, & nixos-help)
options.splitBuild = true;
includeAllModules = false;
};
};
}

114
groups/cryos/programs.nix Normal file
View file

@ -0,0 +1,114 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
# Shell
bash
fish
shellcheck
grc # colorise command outputs
moreutils
# Systems Emulation
qemu # Fellice Bellard's Quick Emulator
# Binaries
binutils
strace
ltrace
perf-tools # ftrace + perf
radare2
gdb
hexyl
# ASM
nasm
x86-manpages
# C Family
gcc
clang
clang-tools
gnumake
cmake
# Rust
cargo
rustc
rustfmt
# Go
go
# Nim
nim
nimble
# Haskell
ghc
ghcid
ormolu
# Nix
nix-prefetch-git
nix-index
nix-unit
deploy-rs.deploy-rs
# Python
python312 # I use 3.12 since it's in a pretty stable state now
python314 # also 3.14 for latest features
poetry
# Sage
sageWithDoc # SageMath + HTML Documentation
# .NET
dotnetCorePackages.dotnet_9.sdk
dotnetCorePackages.dotnet_9.aspnetcore
dotnetCorePackages.dotnet_9.runtime
openvpn
inetutils
wireguard-tools
# security tools
rustscan
nmap
dig
gobuster
nth
zap
httpie
curlie
zoxide
doggo
tldr
btop
eza
yazi
lazygit
ripgrep
viddy # modern `watch` command
timg # terminal image (sixel) viewer
# Pretty necessary
git
git-filter-repo
brightnessctl
acpi
# upower
vim
powertop
imagemagick
# "Standard" Unix Commands
file
wget
tree
pstree
zip
unzip
unrar-free
lz4
man-pages
man-pages-posix
# Cryptography
gnupg
openssl
libargon2
];
}

49
groups/default.nix Normal file
View file

@ -0,0 +1,49 @@
{
root,
pkgs,
upkgs,
lib,
inputs,
config,
...
}: {
nix.settings = {
# make wheel group trusted users allows my "ae" user
# to import packages not signed by a trusted key
# (aka super duper easier to remote deploy)
trusted-users = ["root" "@wheel"];
experimental-features = [
"nix-command"
"flakes"
"pipe-operators"
];
download-buffer-size = 524288000; # 500 MiB
};
time.timeZone = lib.mkDefault "Australia/Brisbane";
i18n.defaultLocale = "en_US.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "us";
};
users.defaultUserShell = pkgs.bash;
home-manager = {
users =
config.users.users
|> builtins.attrNames
|> builtins.filter (x: builtins.pathExists (root + "/homes/${x}"))
|> lib.genAttrs (x: import (root + "/homes/${x}"));
extraSpecialArgs = {inherit inputs pkgs upkgs;};
};
environment.systemPackages = with pkgs; [
git
vim
wget
tree
];
}

54
groups/server/default.nix Normal file
View file

@ -0,0 +1,54 @@
{
lib,
sshPort ? 22,
...
}: {
networking = {
networkmanager.enable = true;
# Use CloudFlare's WARP+ 1.1.1.1 DNS service
nameservers = [
"1.1.1.1"
"1.0.0.1"
];
firewall = {
enable = lib.mkDefault true;
allowedTCPPorts = [
sshPort
];
};
};
security = {
# accept Lets Encrypt's security policy
acme = {
acceptTerms = true;
defaults.email = "them@dobutterfliescry.net";
};
sudo = {
enable = true;
wheelNeedsPassword = true;
};
# allow SSH keys for passwordless auth
pam = {
enableSSHAgentAuth = true;
services.sudo.sshAgentAuth = true; # pam_ssh_agent_auth module
};
};
services = {
openssh = {
enable = true;
ports = [sshPort];
settings = {
PasswordAuthentication = false;
PermitRootLogin = "no";
# AllowUsers = ["cry"]; # DO NOT ALLOW ALL
UseDns = true;
X11Forwarding = false;
};
};
};
}

View file

@ -4,26 +4,29 @@
lib, lib,
config, config,
pkgs, pkgs,
pkgs-unstable, upkgs,
... ...
}: { } @ args: {
imports = [ imports = [
../modules/fish.nix
../modules/btop.nix
../modules/tmux.nix
../modules/term/foot.nix
../modules/git.nix ../modules/git.nix
../modules/bat.nix ../modules/bat.nix
../modules/fish.nix
../modules/editor/helix.nix ../modules/editor/helix.nix
# ../modules/editor/vscodium.nix
../modules/btop.nix
../modules/term/ghostty.nix
../modules/term/foot.nix
# ../modules/term/rio.nix
../modules/firefox.nix ../modules/firefox.nix
../modules/apps/thunderbird.nix
#../modules/wm/hypr/hypridle.nix
../modules/wm/hypr/hyprlock.nix ../modules/wm/hypr/hyprlock.nix
../modules/kanshi.nix ../modules/kanshi.nix
../modules/ags ../modules/mako.nix
];
nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (lib.GetName pkg) [
"vscode-extension-ms-dotnettools-csharp"
]; ];
home = { home = {
@ -35,6 +38,10 @@
man = "batman"; # bat + man man = "batman"; # bat + man
}; };
sessionVariables = {
NIX_SHELL_PRESERVE_PROMPT = 1;
};
pointerCursor = { pointerCursor = {
gtk.enable = true; gtk.enable = true;
# x11.enable = true # dont enable since im on hyprland # x11.enable = true # dont enable since im on hyprland
@ -42,6 +49,18 @@
name = "Bibata-Modern-Ice"; name = "Bibata-Modern-Ice";
size = 16; size = 16;
}; };
packages = with pkgs; [
# for services.gnome-keyring
pkgs.gcr # provides org.gnome.keyring.SystemPrompter
seahorse # gui
tor-browser
fuzzel
speedtest-cli
];
}; };
gtk = { gtk = {
@ -108,6 +127,12 @@
TERM = "linux"; TERM = "linux";
}; };
}; };
clocktown = {
hostname = "clocktown.dobutterfliescry.net";
user = "root";
port = 22;
identityFile = "~/.ssh/id_clocktown";
};
subspace = { subspace = {
hostname = "imbored.dev"; hostname = "imbored.dev";
user = "subspace"; user = "subspace";
@ -136,8 +161,12 @@
}; };
}; };
services = {
# enable OpenSSH private key agent # enable OpenSSH private key agent
services.ssh-agent.enable = true; ssh-agent.enable = true;
gnome-keyring.enable = true;
};
# the ssh-agent won't set this for itself... # the ssh-agent won't set this for itself...
systemd.user.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent"; systemd.user.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent";
# Nicely reload system units when changing configs # Nicely reload system units when changing configs

View file

@ -0,0 +1,10 @@
{...}: {
programs.thunderbird = {
enable = true;
profiles = {
"me" = {
isDefault = true;
};
};
};
}

View file

@ -1,5 +1,64 @@
{pkgs, ...}: { {
# read https://docs.helix-editor.com/editor.html pkgs,
upkgs,
...
}: let
lsps = {
bash-language-server = {
pkg = pkgs.bash-language-server;
cmd = "bash-language-server";
};
clangd = {
pkg = pkgs.clang-tools;
cmd = "clangd";
};
glsl_analyzer = {
pkg = pkgs.glsl_analyzer;
cmd = "glsl_analyzer";
};
haskell-language-server = {
pkg = pkgs.haskell-language-server;
cmd = "haskell-language-server-wrapper";
};
# TODO: once upgraded past Nix-24.07 this line won't be necessary (I think)
# helix will support nixd by default
# SOURCE: https://github.com/nix-community/nixd/blob/main/nixd/docs/editor-setup.md#Helix
nixd = {
pkg = pkgs.nixd;
cmd = "nixd";
};
OmniSharp = {
pkg = pkgs.omnisharp-roslyn;
cmd = "OmniSharp";
};
rust-analyzer = {
pkg = pkgs.rust-analyzer;
cmd = "rust-analyzer";
};
ty = {
pkg = upkgs.ty;
cmd = "ty";
};
typescript-language-server = {
pkg = pkgs.typescript-language-server;
cmd = "typescript-language-server";
};
};
in {
home.packages =
lsps
|> builtins.attrValues
|> map (lsp: lsp.pkg);
# REF: https://docs.helix-editor.com/editor.html
programs.helix = { programs.helix = {
enable = true; enable = true;
settings = { settings = {
@ -128,28 +187,79 @@
}; };
auto-format = false; # my python is beautiful ^_^ auto-format = false; # my python is beautiful ^_^
rulers = [80]; rulers = [80];
language-servers = ["ty"];
} }
{ {
name = "c"; name = "c";
file-types = ["c" "h"]; # use .hpp for C++ file-types = ["c" "h"]; # use .hpp for C++
auto-format = false; auto-format = true;
formatter.command = "${pkgs.clang-tools}/bin/clang-format"; formatter.command = "${pkgs.clang-tools}/bin/clang-format";
language-servers = ["clangd"]; language-servers = ["clangd"];
} }
{
name = "haskell";
auto-format = true;
formatter.command = "${pkgs.ormolu}/bin/ormolu";
language-servers = ["haskell-language-server"];
}
{
name = "rust";
indent = {
tab-width = 2;
unit = " ";
};
auto-format = true;
formatter.command = "${pkgs.rustfmt}/bin/rustfmt";
language-servers = ["rust-analyzer"];
}
{
name = "c-sharp";
file-types = ["cs"];
indent = {
tab-width = 4;
unit = " ";
};
block-comment-tokens = {
start = "/*";
end = "*/";
};
# auto-format = true;
# formatter.command = "${pkgs.omnisharp-roslyn}/bin/OmniSharp";
# language-servers = ["OmniSharp"];
}
{
name = "javascript";
file-types = ["js"];
indent = {
tab-width = 2;
unit = " ";
};
block-comment-tokens = {
start = "/*";
end = "*/";
};
auto-format = true;
language-servers = ["typescript-language-server"];
}
{
name = "glsl";
file-types = ["glsl"];
indent = {
tab-width = 2;
unit = " ";
};
block-comment-tokens = {
start = "/*";
end = "*/";
};
auto-format = false;
language-servers = ["glsl_analyzer"];
}
]; ];
language-server = { language-server =
# use nixd as default nix lsp (I haven't tried nil yet) lsps
# NOTE: nixd will be supported by default after nix 24.07 |> builtins.mapAttrs (_: lsp: {command = "${lsp.pkg}/bin/${lsp.cmd}";});
# SOURCE: https://github.com/nix-community/nixd/blob/main/nixd/docs/editor-setup.md#Helix
nixd = {
command = "${pkgs.nixd}/bin/nixd";
};
# clangd for C
clangd = {
command = "${pkgs.clang-tools}/bin/clangd";
};
};
}; };
}; };
} }

View file

@ -0,0 +1,134 @@
{
config,
lib,
pkgs,
vscodium ? false,
secret-service ? "gnome-libsecret",
vscode-argv ? ".vscode/argv.json",
...
}: {
nixpkgs.overlays = [
(
self: super: {
vscode-extensions = super.vscode-extensions.overrideAttrs (prev: let
mkVscMarketplaceExtension = {
publisher,
name,
version,
hash,
description ? "",
homepage ? null,
changelog ? null,
license ? null,
maintainers ? [lib.maintainers.emileclarkb],
}:
with pkgs.vscode-utils.buildVscodeMarketplaceExtension; {
${publisher}.${name} = buildVscodeMarketplaceExtension {
mktplcRef = {
inherit
publisher
name
version
hash
;
};
meta = {
inherit
(
if license != null
then {license = license;}
else {}
)
description
homepage
maintainers
;
downloadPage = "https://marketplace.visualstudio.com/items?itemName=${publisher}.${name}";
changelog =
if changelog != null
then changelog
else "https://marketplace.visualstudio.com/items/${publisher}.${name}/changelog";
};
};
};
in
lib.mergeAttrsList [
(mkVscMarketplaceExtension {
publisher = "ms-dotnettools";
name = "dotnet-maui";
version = "1.11.14";
hash = lib.fakeHash;
description = "Extend C# Dev Kit with tools for building .NET Multi-platform App UI (MAUI) apps";
homepage = "https://github.com/microsoft/vscode-dotnettools";
license = lib.licenses.unfree;
})
]);
}
)
];
# REF: https://home-manager-options.extranix.com/?query=vscode&release=release-25.05
programs.vscode = {
enable = true;
# TODO: clean up
package =
(
if vscodium
then pkgs.vscodium
else pkgs.vscode
).overrideAttrs (oldAttrs: {
# runtimeDependencies = oldAttrs.runtimeDependencies ++ []
});
mutableExtensionsDir = true;
profiles.default = {
enableUpdateCheck = false;
enableExtensionUpdateCheck = false;
# extension format: USER.PACKAGENAME
extensions = with pkgs.vscode-extensions; [
# .NET
ms-dotnettools.csharp
ms-dotnettools.csdevkit
ms-dotnettools.vscode-dotnet-runtime
# TODO: these extensions aren't packaged :(
# deitry.solution-syntax
# ms-dotnettools.vscode-dotnet-pack
# ms-dotnettools.dotnet-maui
# Python
ms-python.python
# GitLens by GitKraken
eamodio.gitlens
ms-azuretools.vscode-docker
github.copilot
github.copilot-chat
# Colors & Themes
dracula-theme.theme-dracula
catppuccin.catppuccin-vsc
catppuccin.catppuccin-vsc-icons
mvllow.rose-pine
];
userSettings = {
"workbench.colorTheme" = "Dracula Theme";
"github.copilot.nextEditSuggestions.enabled" = true;
};
};
};
# TODO: this is super ugly, make sure the JSON is formatted!!
home.file.${vscode-argv}.text = builtins.toJSON {
password-store = secret-service;
disable-hardware-acceleration = false;
disable-color-correct-rendering = false;
enable-crash-reporter = false;
# crash-report-id = ...;
};
}

View file

@ -1,9 +1,37 @@
{pkgs, ...}: { {
lib,
pkgs,
...
}: {
# REF: https://home-manager-options.extranix.com/?query=vscode&release=release-25.05
programs.vscode = { programs.vscode = {
enable = true; enable = true;
package = pkgs.vscodium; package = pkgs.vscodium;
mutableExtensionsDir = true;
profiles.default = {
enableUpdateCheck = false;
enableExtensionUpdateCheck = false;
# extension format: USER.PACKAGENAME
extensions = with pkgs.vscode-extensions; [ extensions = with pkgs.vscode-extensions; [
# .NET
ms-dotnettools.csharp
ms-dotnettools.csdevkit
ms-dotnettools.vscode-dotnet-runtime
# ms-dotnettools.vscode-dotnet-pack
# ms-dotnettools.dotnet-maui
# Colors & Themes
dracula-theme.theme-dracula
catppuccin.catppuccin-vsc
catppuccin.catppuccin-vsc-icons
mvllow.rose-pine
]; ];
userSettings = {
"workbench.colorTheme" = "Dracula Theme";
};
};
}; };
} }

View file

@ -12,21 +12,54 @@
config = { config = {
programs.fish = { programs.fish = {
enable = true; enable = true;
interactiveShellInit = '' generateCompletions = true;
# vendor = {
# config.enable = true;
# functions.enable = true;
# completions.enable = true;
# };
interactiveShellInit = let
greetings =
[
"Welcome weary traveller to my shop"
"It's dangerous to go alone! Take this."
"Do butterflies cry when they're sad?"
"I hope they do"
"I think Alice is lost..."
"Something wicked this way comes"
"May your L's be many... and your bitches few"
"What a horrible night to have a curse."
"The ancient spirits of light and dark have been released."
"The god of the stars rejects your offering. The ritual can only be performed at night."
"You should have just died..."
"Supreme Witch, Calamitas has killed every player!"
]
|> map (x: "\"${x}\"")
|> builtins.concatStringsSep " ";
in ''
# add dotnet completions if it exists (ie we're in a virtual environment) # add dotnet completions if it exists (ie we're in a virtual environment)
if type -q dotnet if type -q dotnet
complete -f -c dotnet -a "(dotnet complete (commandline -cp))" complete -f -c dotnet -a "(dotnet complete (commandline -cp))"
end end
function rand_greet function rand_greet
set weary "Welcome weary traveller to my shop" set greetings ${greetings}
set alone "It's dangerous to go alone! Take this."
set sad "Do butterflies cry when they're sad?"
set alice "I think Alice is lost..."
set greetings "$weary" "$alone" "$sad" "$alice"
echo -n $greetings[(random 1 (count $greetings))] echo -n $greetings[(random 1 (count $greetings))]
end end
function gitignore -a type
curl -sL "https://www.gitignore.io/api/$type"
end
# ripgrep on files
function rgf
rg --files | rg $args
end
set -g fish_greeting (rand_greet) set -g fish_greeting (rand_greet)

View file

@ -5,6 +5,19 @@
}: { }: {
programs.git = { programs.git = {
enable = true; enable = true;
lfs.enable = true;
userName = "Emile Clark-Boman";
userEmail = "eclarkboman@gmail.com";
aliases = {
s = "status";
d = "diff";
l = "log";
c = "commit";
p = "push";
};
extraConfig = { extraConfig = {
color.ui = true; color.ui = true;
core.editor = "hx"; core.editor = "hx";
@ -14,16 +27,44 @@
defaultBranch = "main"; defaultBranch = "main";
}; };
url = { url = {
"https://github.com/" = { "git@github.com:" = {
insteadOf = [ insteadOf = [
"gh:" "gh:"
"github:" "github:"
]; ];
}; };
"https://gitlab.com/" = {
insteadOf = [
"gl:"
"gitlab:"
];
};
"git@github.com:/Agribit/" = {
insteadOf = [
"agri:"
"Agri:"
"agribit:"
"Agribit:"
];
};
"ssh://forgejo@forge.imbored.dev:2222/" = {
insteadOf = [
"forge"
];
};
"ssh://forgejo@forge.imbored.dev:2222/emileclarkb/" = {
insteadOf = [
"cry"
];
};
}; };
}; };
userName = "Emile Clark-Boman"; includes = [
userEmail = "eclarkboman@gmail.com"; {
path = "/home/me/agribit/.gitconfig";
condition = "gitdir:/home/me/agribit/**";
}
];
}; };
} }

54
homes/modules/mako.nix Normal file
View file

@ -0,0 +1,54 @@
{...}: let
dracula = rec {
background = "#282A36";
border = cyan;
cyan = "#8BE9FD";
yellow = "#F1FA8C";
red = "#FF5555";
};
theme = dracula;
in {
# notification daemon for Wayland
services.mako = {
enable = true;
settings = {
actions = true;
anchor = "top-right";
layer = "overlay";
sort = "-time";
height = 100;
width = 300;
margin = 50;
background-color = theme.background;
border-color = theme.border;
border-radius = 20;
border-size = 4;
font = "monospace 10";
markup = true;
icons = true;
max-icon-size = 64;
default-timeout = 5000;
ignore-timeout = false;
"actionable=true" = {
anchor = "top-left";
};
"urgency=low" = {
border-color = theme.border;
};
"urgency=normal" = {
border-color = theme.yellow;
};
"urgency=high" = {
default-timeout = 0;
border-color = theme.red;
};
};
};
}

248
homes/modules/nixcord.nix Executable file → Normal file
View file

@ -1,16 +1,248 @@
{ {inputs, ...}: {
config, imports = [
pkgs, inputs.nixcord.homeModules.nixcord
... ];
}: {
programs.nixcord = { programs.nixcord = {
enable = true; enable = true;
equibop.enable = true;
discord = {
vencord.enable = false;
equicord.enable = true;
};
config = { config = {
frameless = true; enabledThemes = [
# "aurorastheme.css"
# "base16-colors.css"
];
plugins = { plugins = {
# TODO: remove this plugin anonymiseFileNames = {
hideAttachments.enable = true; enable = true;
anonymiseByDefault = true;
method = 0;
randomisedLength = 16;
};
betterSessions = {
backgroundCheck = true;
checkInterval = 1;
};
biggerStreamPreview.enable = true;
callTimer.enable = true;
fixYoutubeEmbeds.enable = true;
fixSpotifyEmbeds.enable = true;
tidalEmbeds.enable = true;
youtubeAdblock.enable = true;
followVoiceUser.enable = true;
friendsSince.enable = true;
ircColors = {
enable = true;
lightness = 80;
memberListColors = true;
applyColorOnlyInDms = false;
applyColorOnlyToUsersWithoutColor = false;
};
messageLogger = {
enable = true;
showEditDiffs = true;
separatedDiffs = false;
};
# fakeNitro.enable = true;
ghosted.enable = true;
noF1.enable = true;
noMaskedUrlPaste.enable = true;
messageLatency = {
enable = false;
latency = -1;
showMillis = true;
};
openInApp.enable = true;
crashHandler.enable = true;
disableCallIdle.enable = true;
experiments.enable = true;
expressionCloner.enable = true;
favoriteGifSearch.enable = true;
fixImagesQuality.enable = true;
forceOwnerCrown.enable = true;
forwardAnywhere.enable = true;
spotifyCrack.enable = true;
spotifyShareCommands.enable = true;
spotifyControls.enable = true;
fullUserInChatbox.enable = true;
gifPaste.enable = true;
ignoreActivities = {
enable = true;
ignorePlaying = true;
ignoreStreaming = true;
ignoreListening = true;
ignoreWatching = true;
ignoreCompeting = true;
};
imageLink.enable = true;
imageZoom.enable = true;
memberCount.enable = true;
noDevtoolsWarning.enable = true;
noUnblockToJump.enable = true;
pauseInvitesForever.enable = true;
permissionsViewer.enable = true;
pictureInPicture = {
enable = true;
loop = true;
};
platformIndicators.enable = true;
previewMessage.enable = true;
relationshipNotifier.enable = true;
revealAllSpoilers.enable = true;
serverInfo.enable = true;
serverListIndicators.enable = true;
showHiddenChannels.enable = true;
showHiddenThings.enable = true;
showTimeoutDuration = {
enable = true;
displayStyle = "tooltip";
};
silentTyping = {
enable = true;
enabledGlobally = false;
};
startupTimings.enable = true;
typingIndicator.enable = true;
unlockedAvatarZoom = {
enable = true;
zoomMultiplier = 4.0;
};
userMessagesPronouns.enable = true;
validUser.enable = true;
validReply.enable = true;
viewIcons = {
enable = true;
format = "webp";
imgSize = "4096";
};
voiceChatDoubleClick.enable = true;
voiceDownload.enable = true;
voiceMessages = {
enable = true;
noiseSuppression = false;
echoCancellation = true;
};
volumeBooster.enable = true;
webKeybinds.enable = true;
webScreenShareFixes.enable = true;
whoReacted.enable = true;
whosWatching.enable = true;
quickReply.enable = true;
questCompleter.enable = true;
shikiCodeblocks = {
enable = true;
useDevIcon = "COLOR";
theme = "https://raw.githubusercontent.com/shikijs/textmate-grammars-themes/2d87559c7601a928b9f7e0f0dda243d2fb6d4499/packages/tm-themes/themes/kanagawa-wave.json";
}; };
}; };
}; };
};
programs.nixcord.config.plugins.PinDMs = {
enable = true;
canCollapseDmSection = true;
# userBasedCategoryList = {
# "1202666382760607774" = [
# {
# id = "i9dflmraztc";
# name = "🏳️‍⚧️ girlfriends!!! :3 🏳️‍⚧️";
# color = 16359423;
# collapsed = false;
# channels = [
# "1436964273162289185"
# "1436988320474206311"
# "1449837047383855119"
# "1436965652861685891"
# "1436968495190642722"
# "1465424321919975454"
# ];
# }
# {
# id = "p2v1f5y9zbd";
# name = "🦋 best frens <3 🦋";
# color = 10223511;
# collapsed = false;
# channels = [
# "1436985374286155799"
# "1436965657076826222"
# "1429921297160212681"
# "1394808379381387385"
# "1433593753183977545"
# "1438254055452446881"
# "1436966389549236376"
# "1202678007026819134"
# "1437151552224624660"
# "1441906462094921789"
# "1450340272079769712"
# "1458123717124165764"
# "1436975341129306155"
# "1461885176534794427"
# "1462155159470866443"
# "1468735915076878407"
# ];
# }
# {
# id = "c0mg5w635j8";
# name = "🏳️‍🌈 close frens x3 🏳️‍🌈";
# color = 10780927;
# collapsed = false;
# channels = [
# "1437077103873888290"
# "1436975346338762823"
# "1437123353101205590"
# "1441516692164575283"
# "1419557866502754334"
# "1436985041203892315"
# "1438071327515742229"
# ];
# }
# {
# id = "ghjrq5el3b";
# name = "frens :3";
# color = 7334399;
# collapsed = false;
# channels = [
# "1437007154132422701"
# "1437006448948416526"
# "1446781617422209068"
# "1444723474835837103"
# "1437098569483161721"
# "1437237573146771469"
# "1436973705421914123"
# "1437135359359320125"
# "1438010723837022343"
# "1440553969461104740"
# "1437097082887475201"
# "1447222320015085740"
# "1462624704027164824"
# "1449513783893692589"
# "1463737720961634461"
# "1463000874392748249"
# "1461929299727749145"
# "1436984534712451105"
# "1436983282582683813"
# "1437283420312047659"
# "1437089201651847315"
# "1468324280445046824"
# ];
# }
# {
# id = "zbmj00xw7d8";
# name = "goop chats";
# color = 14876549;
# collapsed = false;
# channels = [
# "1437132769141719040"
# "1445549416516681902"
# "1458849972815663209"
# ];
# }
# ];
# };
};
} }

View file

@ -1,7 +1,7 @@
{pkgs-unstable, ...}: { {upkgs, ...}: {
programs.foot = { programs.foot = {
enable = true; enable = true;
package = pkgs-unstable.foot; package = upkgs.foot;
server.enable = true; server.enable = true;

5
homes/modules/tmux.nix Normal file
View file

@ -0,0 +1,5 @@
{...}: {
programs.tmux = {
enable = true;
};
}

View file

@ -1,2 +1,43 @@
# NOTE: hyprland must be enabled in BOTH your host config (for running hyprland) # NOTE: hyprland must be enabled in BOTH your host config (for running hyprland)
# and your home-manager config (for managing hyprland's config files) # and your home-manager config (for managing hyprland's config files)
{
pkgs,
pkgs-unstable,
inputs,
config,
lib,
...
}: {
options.hyprland = {
enable = lib.mkEnableOption "Hyprland";
};
config = lib.mkIf config.hyprland.enable {
wayland.windowManager.hyprland = {
enable = true;
package = pkgs.hyprland; # pkgs-unstable.hyprland;
xwayland.enable = true;
systemd = {
enable = true;
# enable autostart of applications
# REF: `man 8 systemd-xdg-autostart-generator`
enableXdgAutostart = true;
};
plugins = with inputs; [
split-monitor-workspaces.packages.${pkgs.system}.split
];
};
xdg.portal = {
enable = true;
extraPortals = with pkgs; [
xdg-desktop-portal-gtk
];
};
# TODO: finish this
};
}

View file

@ -1,87 +0,0 @@
{
inputs,
outputs,
lib,
config,
pkgs,
...
}: {
nixpkgs = {
config.allowUnfree = false;
};
imports = [
];
home = {
username = "subspace";
homeDirectory = "/home/subspace";
};
programs = {
fish = {
enable = true;
# Extra commands to run when entering a interactive shell
# (for the subspace user this will be exiting fish to
# run wishlist instead, a shell should not pop up!)
loginShellInit = ''
clear
exec wishlist
'';
};
ssh = {
enable = true;
forwardAgent = true;
addKeysToAgent = "yes";
matchBlocks = {
hyrule = {
hostname = "imbored.dev";
user = "ae";
port = 22;
identityFile = "~/.ssh/id_hyrule";
setEnv = {
TERM = "linux";
};
};
dead = {
hostname = "deadlyserver.com";
user = "emile";
port = 29843;
identityFile = "~/.ssh/id_deadlyserver";
setEnv = {
TERM = "xterm-256color";
};
};
youcue = {
hostname = "moss.labs.eait.uq.edu.au";
user = "s4740056";
port = 22;
identityFile = "~/.ssh/id_youcue";
setEnv = {
TERM = "xterm-256color";
};
};
};
};
};
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";
# SERVICE: webfishing (example for wishlist)
#systemd.user.services.webfishing = {
# Unit.Description = "I be out here webfishing frfr";
# Install.WantedBy = ["default.target"];
# Service = {
# Type = "exec";
# ExecStart = "echo $HOME; cat $HOME/.ssh/config";
# Restart = "always";
# };
#};
home.stateVersion = "24.11"; # DO NOT MODIFY
}

77
hosts/butterfly/default.nix Executable file
View file

@ -0,0 +1,77 @@
{...}: {
imports = [
./hardware-configuration.nix
./services
];
# super duper minimum grub2 config
boot.loader.grub = {
enable = true;
device = "/dev/vda";
};
networking = {
hostName = "butterfly";
firewall = {
allowedTCPPorts = [
80 # nginx
# 143 # IMAP4
443 # nginx
# 587 # SMTPS
2222 # forgejo ssh
2035 # debug (for my job)
# 3000 (INTERNAL) forgejo
# 3306 (INTERNAL) forgejo sqlite3 database
5000 # debug (for my job)
# 8222 (INTERNAL) vaultwarden
45000 # minecaft server
];
allowedUDPPorts = [
54231 # Wireguard
];
};
# wg-quick.interfaces = {
# wg0 = {
# address = [
# "10.10.10.4/24"
# ];
# dns = ["10.10.10.1"];
# privateKeyFile = "/root/wg_agrivpn_hyrule";
# peers = [
# {
# # peer's public key
# publicKey = "iZ4aqYjbT8O8tfUHEuV+yWLtdoQbdBb6Nt0M4usMSiY=";
# # choose which traffic to forward
# allowedIPs = [
# "10.0.51.0/24"
# "10.10.10.0/24"
# ];
# endpoint = "150.242.34.33:54231";
# }
# ];
# };
# };
};
users = {
users = {
# primary user
cry = {
isNormalUser = true;
home = "/home/cry";
extraGroups = ["wheel"];
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCsUZY45rgezi+8iROdcR5vPeacJ2fbMjlDijfUrH9hRX2FzCsg/4e3aFKhi2seZMmyTfbstxmDrrH8paUS5TibFgLFBGNngaF3CTjg85i5pm25Hr4IVo31oziBnTWaG6j3buYKtz5e1qSPzXywinJR+5+FCUJU7Fxa+EWTZcOX4wYgArSj4q73rZmvk5N0X44Mudt4nvpD2chvxygsdTzD6ph92qCuaJ/AbfmOoC7b/xvOaOVydUfgDLpHi9VZbd3akvvKxRfW6ZklldgXEzPXKMuastN0mwcBxvIb5G1Vkj8jtSVtKPc5psZ9/NWA5l38xH4qZ6z7eib6thtEMdtcKmTZEEWDADjqTea5Gj61c1n18cr6f3Tff+0bn/cxsl4Y0esi+aDeuCXYiIYNmeKBx0ttDNIxpk4J5Fdh6Xs+AZif5lnJErtu8TPy2aC0bc9wehTjMyvilTHfyerOD1ZJXhN2XwRVDGN7t7leAJZISJlPjqTDcw3Vfvzte/5JqS+FR+hbpG4uz2ix8kUa20u5YF2oSdGl8+zsdozVsdQm10Iv9WSXBV7t4m+oyodgtfzydBpmXq7aBXudCiEKw+7TC7F+1a4YFrVrCNXKFgKUpd1MiVLl7DIbzm5U9MD2BB3Fy7BPCzr3tW6/ExOhhpBWY+HnzVGQfkNr7dRcqfipKw== ae@dobutterfliescry.net"
];
};
};
};
virtualisation.docker.enable = true;
system.stateVersion = "24.11"; # DO NOT MODIFY
}

View file

@ -0,0 +1,37 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/profiles/qemu-guest.nix")
];
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "ahci" "sd_mod" "sr_mod" "virtio_blk" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-label/NIXROOT";
fsType = "ext4";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-label/NIXBOOT";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
swapDevices = [ ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.ens3.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}

View file

@ -0,0 +1,5 @@
{...}: {
imports = [
./nginx.nix
];
}

View file

@ -0,0 +1,150 @@
{...}: {
# more options here: https://mynixos.com/nixpkgs/options/services.forgejo
# TODO: set a favicon https://forgejo.org/docs/next/contributor/customization/#changing-the-logo
# (might need me to override settings in the nixpkg)
# TODO: create a custom theme for forgejo (modify the source files most likely)
services.forgejo = {
enable = true;
# enable support for Git Large File Storage
lfs.enable = true;
database = {
type = "sqlite3"; # postgres
host = "127.0.0.1";
port = "3306"; # 5432 if postgres
};
# settings are written directly to the `app.ini` config file
# refer to: https://forgejo.org/docs/latest/admin/config-cheat-sheet/
settings = {
server = {
# ENABLE_ACME = true;
# ACME_EMAIL = "eclarkboman@gmail.com"; # change this to "me@imbored.dev"
DOMAIN = "dobutterfliescry.net"; # should this be "imbored.dev"?
ROOT_URL = "https://forge.dobutterfliescry.net"; # full public URL of the Forgejo server
# address and port to listen on
HTTP_ADDR = "127.0.0.1";
HTTP_PORT = 3000;
PROTOCOL = "http"; # http internally, reverse proxy uses https externally
START_SSH_SERVER = true;
DISABLE_SSH = false;
SSH_PORT = 2222;
};
DEFAULT = {
APP_NAME = "tearforge";
APP_SLOGIN = "but cozy";
APP_DISPLAY_NAME_FORMAT = "{APP_NAME} ::{APP_SLOGAN}::";
};
repository = {
DEFAULT_PRIVATE = "private"; # last, private, public
# repo/org created on push to non-existent
ENABLE_PUSH_CREATE_USER = true;
ENABLE_PUSH_CREATE_ORG = false;
DEFAULT_PUSH_CREATE_PRIVATE = true;
MAX_CREATION_LIMIT = -1;
};
"repository.upload" = {
# max per-file size in MB
FILE_MAX_SIZE = 50;
# max number of files per upload
MAX_FILES = 5;
};
badges = let
# flat, flat-square, plastic, for-the-badge, social
style = "for-the-badge";
in {
ENABLED = true;
GENERATOR_URL_TEMPLATE = "https://img.shields.io/badge/{{.label}}-{{.text}}-{{.color}}?style=${style}";
};
ui = {
DEFAULT_THEME = "forgejo-dark";
THEMES = "forgejo-auto,forgejo-light,forgejo-dark";
};
"ui.meta" = {
AUTHOR = "Emile Clark-Boman - emileclarkb";
DESCRIPTION = "This is my personal self-hosted git forge, where I keep and maintain personal projects! PS do butterflies cry when they're sad?";
KEYWORDS = "emile,clark,boman,clarkboman,emileclarkb,git,forge,forgejo,self-hosted,dobutterfliescry,butterfly,butterflies";
};
markdown = {
ENABLE_HARD_LINE_BREAK_IN_COMMENTS = true;
ENABLE_MATH = true;
};
admin = {
DEFAULT_EMAIL_NOTIFICATIONS = "enabled";
SEND_NOTIFICATION_EMAIL_ON_NEW_USER = true;
};
security = {
# Controls access to the installation page.
# When set to “true”, the installation page is not accessible.
#INSTALL_LOCK = false;
PASSWORD_HASH_ALGO = "argon2"; # ARGON2 BEST ALGO FR!! (default: argon2$2$65536$8$50)
MIN_PASSWORD_LENGTH = 12;
PASSWORD_COMPLEXITY = "lower,upper,digit,spec";
PASSWORD_CHECK_PWN = true;
};
service = {
DISABLE_REGISTRATION = true; # toggle for new users
#DEFAULT_USER_IS_RESTRICTED = true;
# Forbid login with third-party services (ie github)
ALLOW_ONLY_INTERNAL_REGISTRATION = true;
ENABLE_CAPTCHA = true;
REQUIRE_CAPTCHA_FOR_LOGIN = true;
REQUIRE_EXTERNAL_REGISTRATION_CAPTCHA = true;
LOGIN_REMEMBER_DAYS = 365;
ENABLE_NOTIFY_MAIL = true;
};
"service.explore" = {
REQUIRE_SIGNIN_VIEW = false;
DISABLE_USERS_PAGE = false;
DISABLE_ORGANIZATIONS_PAGE = false;
DISABLE_CODE_PAGE = false;
};
cache = {
ADAPTER = "twoqueue";
HOST = "{\"size\":100, \"recent_ratio\":0.25, \"ghost_ratio\":0.5}";
ITEM_TTL = "16h";
};
# TODO: fill this in once my mail server is configured
# email.incoming = { ... };
# optional
# TODO: fill this in once my mail server is configured
mailer = {
ENABLED = false;
SMTP_ADDR = "mail.dobutterfliescry.net";
FROM = "iforgor@dobutterfliescry.net";
USER = "iforgor@dobutterfliescry.net";
};
log = {
MODE = "file";
LEVEL = "Info"; # "Trace", "Debug", "Info", "Warn", "Error", "Critical"
ENABLE_SSH_LOG = true;
};
cron = {
ENABLED = true;
RUN_AT_START = false;
};
other = {
SHOW_FOOTER_VERSION = true;
SHOW_FOOTER_TEMPLATE_LOAD_TIME = true;
SHOW_FOOTER_POWERED_BY = true;
ENABLE_SITEMAP = true;
ENABLE_FEED = true;
};
};
};
}

View file

@ -28,6 +28,7 @@
aliases = ["emile@imbored.dev"]; aliases = ["emile@imbored.dev"];
hashedPasswordFile = let hashedPasswordFile = let
CWD = builtins.getEnv "PWD"; CWD = builtins.getEnv "PWD";
# XXX: TODO: use a secrets manager!
in "${CWD}/secrets/passwd/me"; in "${CWD}/secrets/passwd/me";
}; };
}; };

View file

@ -1,11 +1,11 @@
{ {
pkgs, pkgs,
pkgs-unstable, upkgs,
... ...
}: { }: {
services.minecraft-server = { services.minecraft-server = {
enable = true; enable = true;
package = pkgs-unstable.minecraft-server; # use latest version only! package = upkgs.minecraft-server; # use latest version only!
declarative = true; declarative = true;
eula = true; eula = true;

View file

@ -0,0 +1,83 @@
{
inputs,
pkgs,
...
}: {
nixpkgs.overlays = [
(self: super: {
# in wake of CVE-2022-3602/CVE-2022-3786
nginxStable = super.nginxStable.override {openssl = pkgs.libressl;};
})
inputs.dobutterfliescry-net.overlays.default
];
# simple nginx instance to host static construction page
# TODO: I want sshd and forgejo's ssh server to both be bound to port 22
# So change sshd to listen on a different address/port (ie 2222 or 127.0.0.3:22, etc)
# and change forgejo to use 127.0.0.2:22 (use port 22, ONLY change loopback address)
services.nginx = {
enable = true;
# XXX: TODO: this should auto use the nginxStable overlay no?
# in wake of CVE-2022-3602/CVE-2022-3786
# package = pkgs.nginxStable.override {openssl = pkgs.libressl;};
recommendedGzipSettings = true;
recommendedZstdSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
# streamConfig = ''
# server {
# listen 127.0.0.1:53 udp reuseport;
# proxy_timeout 20s;
# proxy_pass 192.168.0.1:53535;
# }
# '';
virtualHosts = let
localhost = "http://127.0.0.1";
std = {
# TODO: should I run over QUIC+HTTP3? (experimental)
# quic = true;
# http3 = true;
enableACME = true;
# kTLS = true; # offload TLS to the linux kernel
};
vault =
{
forceSSL = true;
locations."/".proxyPass = "${localhost}:8222";
}
// std;
forge =
{
forceSSL = true;
extraConfig = ''
client_max_body_size 512M;
'';
locations."/".proxyPass = "${localhost}:3000";
}
// std;
in {
"dobutterfliescry.net" =
{
default = true;
addSSL = true; # not strictly enforced <3
# root = "/var/www/cry";
root = "${pkgs.dobutterfliescry-net}/www";
# extraConfig = ''
# error_page 404 /custom_404.html;
# '';
}
// std;
# Route "vault" subdomain to vaultwarden
"vault.imbored.dev" = vault;
# Route "forge" subdomain to forgejo
# TODO: use `forgejo.settings.server.ENABLE_ACME` instead?
# "tearforge.net" = forge;
"forge.dobutterfliescry.net" = forge;
};
};
}

View file

@ -0,0 +1,25 @@
{...}: {
services.vaultwarden = {
enable = true;
dbBackend = "sqlite";
# backupDir = "/var/backup/vaultwarden"; # disable with null
# https://mynixos.com/nixpkgs/option/services.vaultwarden.config
config = {
# internal address and port to listen on
ROCKET_ADDRESS = "127.0.0.1";
ROCKET_PORT = 8222;
# hostname to listen for
DOMAIN = "https://vault.imbored.dev";
# signup policy
SIGNUPS_ALLOWED = false;
SIGNUPS_VERIFY = true;
INVITATIONS_ALLOWED = true;
};
# https://mynixos.com/nixpkgs/option/services.vaultwarden.environmentFile
environmentFile = "/var/lib/vaultwarden/vaultwarden.env";
};
}

View file

@ -1,65 +1,10 @@
{ {pkgs, ...}: {
pkgs,
pkgs-unstable,
inputs,
lib,
...
}: let
home-manager = builtins.fetchTarball {
url = "https://github.com/nix-community/home-manager/archive/release-25.05.tar.gz";
sha256 = "026rvynmzmpigax9f8gy9z67lsl6dhzv2p6s8wz4w06v3gjvspm1";
};
in {
imports = [ imports = [
./hardware-configuration.nix ./hardware-configuration.nix
(import "${home-manager}/nixos")
./mailserver.nix # TEMP: location ./services
./minecraft-server.nix # TEMP: location
#../modules/server/nginx.nix
#../modules/server/ssh.nix
#../modules/server/fail2ban.nix
]; ];
nix.settings = {
# make wheel group trusted users allows my "ae" user
# to import packages not signed by a trusted key
# (aka super duper easier to remote deploy)
trusted-users = ["root" "@wheel"];
experimental-features = [
"nix-command"
"flakes"
];
};
# nixpkgs.config.allowUnfreePredicate = let
# whitelist = map lib.getName [
# "minecraft-server"
# pkgs.minecraft-server
# pkgs-unstable.minecraft-server
# ];
# in
# pkg: builtins.elem (lib.getName pkg) whitelist;
time.timeZone = "Australia/Brisbane";
i18n.defaultLocale = "en_US.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "us";
};
# colmena deployment configuration
deployment = {
targetHost = "imbored.dev";
targetUser = "ae";
targetPort = 22;
sshOptions = [
"-A" # forward ssh-agent
];
buildOnTarget = false; # build locally then deploy
};
# super duper minimum grub2 config # super duper minimum grub2 config
boot.loader.grub = { boot.loader.grub = {
enable = true; enable = true;
@ -68,408 +13,61 @@ in {
networking = { networking = {
hostName = "hyrule"; hostName = "hyrule";
networkmanager.enable = true;
firewall = { firewall = {
enable = true;
allowedTCPPorts = [ allowedTCPPorts = [
22 # sshd
80 # nginx 80 # nginx
# 143 # IMAP4
443 # nginx 443 # nginx
# 587 # SMTPS ];
2222 # forgejo ssh allowedUDPPorts = [
2035 # debug (for my job) 54231 # Wireguard
# 3000 (INTERNAL) forgejo
# 3306 (INTERNAL) forgejo sqlite3 database
5000 # debug (for my job)
# 8222 (INTERNAL) vaultwarden
45000 # minecaft server
]; ];
}; };
# wg-quick.interfaces = {
# wg0 = {
# address = [
# "10.10.10.4/24"
# ];
# dns = ["10.10.10.1"];
# privateKeyFile = "/root/wg_agrivpn_hyrule";
# peers = [
# {
# # peer's public key
# publicKey = "iZ4aqYjbT8O8tfUHEuV+yWLtdoQbdBb6Nt0M4usMSiY=";
# # choose which traffic to forward
# allowedIPs = [
# "10.0.51.0/24"
# "10.10.10.0/24"
# ];
# endpoint = "150.242.34.33:54231";
# }
# ];
# };
# };
}; };
users = { users = {
defaultUserShell = pkgs.bash;
users = { users = {
# primary user # primary user
ae = { cry = {
isNormalUser = true; isNormalUser = true;
extraGroups = ["wheel"]; extraGroups = ["wheel"];
shell = pkgs.bash; shell = pkgs.bash;
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCsUZY45rgezi+8iROdcR5vPeacJ2fbMjlDijfUrH9hRX2FzCsg/4e3aFKhi2seZMmyTfbstxmDrrH8paUS5TibFgLFBGNngaF3CTjg85i5pm25Hr4IVo31oziBnTWaG6j3buYKtz5e1qSPzXywinJR+5+FCUJU7Fxa+EWTZcOX4wYgArSj4q73rZmvk5N0X44Mudt4nvpD2chvxygsdTzD6ph92qCuaJ/AbfmOoC7b/xvOaOVydUfgDLpHi9VZbd3akvvKxRfW6ZklldgXEzPXKMuastN0mwcBxvIb5G1Vkj8jtSVtKPc5psZ9/NWA5l38xH4qZ6z7eib6thtEMdtcKmTZEEWDADjqTea5Gj61c1n18cr6f3Tff+0bn/cxsl4Y0esi+aDeuCXYiIYNmeKBx0ttDNIxpk4J5Fdh6Xs+AZif5lnJErtu8TPy2aC0bc9wehTjMyvilTHfyerOD1ZJXhN2XwRVDGN7t7leAJZISJlPjqTDcw3Vfvzte/5JqS+FR+hbpG4uz2ix8kUa20u5YF2oSdGl8+zsdozVsdQm10Iv9WSXBV7t4m+oyodgtfzydBpmXq7aBXudCiEKw+7TC7F+1a4YFrVrCNXKFgKUpd1MiVLl7DIbzm5U9MD2BB3Fy7BPCzr3tW6/ExOhhpBWY+HnzVGQfkNr7dRcqfipKw== ae@imbored.dev" "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCsUZY45rgezi+8iROdcR5vPeacJ2fbMjlDijfUrH9hRX2FzCsg/4e3aFKhi2seZMmyTfbstxmDrrH8paUS5TibFgLFBGNngaF3CTjg85i5pm25Hr4IVo31oziBnTWaG6j3buYKtz5e1qSPzXywinJR+5+FCUJU7Fxa+EWTZcOX4wYgArSj4q73rZmvk5N0X44Mudt4nvpD2chvxygsdTzD6ph92qCuaJ/AbfmOoC7b/xvOaOVydUfgDLpHi9VZbd3akvvKxRfW6ZklldgXEzPXKMuastN0mwcBxvIb5G1Vkj8jtSVtKPc5psZ9/NWA5l38xH4qZ6z7eib6thtEMdtcKmTZEEWDADjqTea5Gj61c1n18cr6f3Tff+0bn/cxsl4Y0esi+aDeuCXYiIYNmeKBx0ttDNIxpk4J5Fdh6Xs+AZif5lnJErtu8TPy2aC0bc9wehTjMyvilTHfyerOD1ZJXhN2XwRVDGN7t7leAJZISJlPjqTDcw3Vfvzte/5JqS+FR+hbpG4uz2ix8kUa20u5YF2oSdGl8+zsdozVsdQm10Iv9WSXBV7t4m+oyodgtfzydBpmXq7aBXudCiEKw+7TC7F+1a4YFrVrCNXKFgKUpd1MiVLl7DIbzm5U9MD2BB3Fy7BPCzr3tW6/ExOhhpBWY+HnzVGQfkNr7dRcqfipKw== ae@dobutterfliescry.net"
]; ];
}; };
# TODO: reduce security implications of subspace friends = {
subspace = {
isNormalUser = true; isNormalUser = true;
shell = pkgs.bash; shell = pkgs.fish;
home = "/home/subspace"; home = "/home/friends";
packages = with pkgs; [
wishlist
];
}; };
}; };
}; };
virtualisation.docker.enable = true; virtualisation.docker.enable = true;
home-manager = {
users = {
ae = import ../../homes/ae;
subspace = import ../../homes/subspace;
};
};
services = {
# simple nginx instance to host static construction page
# TODO: I want sshd and forgejo's ssh server to both be bound to port 22
# So change sshd to listen on a different address/port (ie 2222 or 127.0.0.3:22, etc)
# and change forgejo to use 127.0.0.2:22 (use port 22, ONLY change loopback address)
nginx = {
enable = true;
# in wake of CVE-2022-3602/CVE-2022-3786
package = pkgs.nginxStable.override {openssl = pkgs.libressl;};
recommendedGzipSettings = true;
recommendedZstdSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
# streamConfig = ''
# server {
# listen 127.0.0.1:53 udp reuseport;
# proxy_timeout 20s;
# proxy_pass 192.168.0.1:53535;
# }
# '';
virtualHosts = let
localhost = "http://127.0.0.1";
std = {
# TODO: should I run over QUIC+HTTP3? (experimental)
# quic = true;
# http3 = true;
enableACME = true;
# kTLS = true; # offload TLS to the linux kernel
};
in {
"imbored.dev" =
{
default = true;
addSSL = true; # not strictly enforced <3
root = "/var/www/imbored";
# extraConfig = ''
# error_page 404 /custom_404.html;
# '';
}
// std;
# Route "vault" subdomain to vaultwarden
"vault.imbored.dev" =
{
forceSSL = true;
locations."/".proxyPass = "${localhost}:8222";
}
// std;
# Route "forge" subdomain to forgejo
# TODO: use `forgejo.settings.server.ENABLE_ACME` instead?
"forge.imbored.dev" =
{
forceSSL = true;
extraConfig = ''
client_max_body_size 512M;
'';
locations."/".proxyPass = "${localhost}:3000";
}
// std;
};
};
openssh = {
enable = true;
ports = [22];
settings = {
PasswordAuthentication = false;
PermitRootLogin = "no";
AllowUsers = ["ae" "subspace"]; # DO NOT ALLOW ALL
UseDns = true;
X11Forwarding = false;
};
};
vaultwarden = {
enable = true;
dbBackend = "sqlite";
# backupDir = "/var/backup/vaultwarden"; # disable with null
# https://mynixos.com/nixpkgs/option/services.vaultwarden.config
config = {
# internal address and port to listen on
ROCKET_ADDRESS = "127.0.0.1";
ROCKET_PORT = 8222;
# hostname to listen for
DOMAIN = "https://vault.imbored.dev";
# signup policy
SIGNUPS_ALLOWED = false;
SIGNUPS_VERIFY = true;
INVITATIONS_ALLOWED = true;
};
# https://mynixos.com/nixpkgs/option/services.vaultwarden.environmentFile
environmentFile = "/var/lib/vaultwarden/vaultwarden.env";
};
# stalwart-mail = let
# domain = "imbored.dev";
# in {
# enable = false; # true;
# # openFirewall = true; # im doing this manually rn
# settings = {
# certificate."${domain}" = {
# cert = "file://${certs.${domain}.cert}";
# private-key = "file://${certs.${domain}.key}";
# };
# server = {
# hostname = domain;
# tls = {
# certificate = "${domain}";
# enable = true;
# implicit = false;
# };
# listener = {
# "smtp-submission" = {
# bind = ["127.0.0.1:587"];
# protocol = "smtp";
# };
# "imap" = {
# bind = ["127.0.0.1:143"];
# protocol = "imap";
# };
# };
# };
# session = {
# rcpt.directory = "in-memory";
# auth = {
# mechanisms = ["PLAIN"];
# directory = "in-memory";
# };
# };
# jmap.directory = "in-memory";
# queue.outbound.next-hop = ["local"];
# directory."in-memory" = {
# type = "memory";
# users = [
# {
# name = "me";
# secret = "foobar";
# email = ["me@${domain}"];
# }
# {
# name = "Emile";
# secret = "foobar";
# email = ["emile@${domain}"];
# }
# ];
# };
# };
# };
# more options here: https://mynixos.com/nixpkgs/options/services.forgejo
# TODO: set a favicon https://forgejo.org/docs/next/contributor/customization/#changing-the-logo
# (might need me to override settings in the nixpkg)
# TODO: create a custom theme for forgejo (modify the source files most likely)
forgejo = {
enable = true;
# enable support for Git Large File Storage
lfs.enable = true;
database = {
type = "sqlite3"; # postgres
host = "127.0.0.1";
port = "3306"; # 5432 if postgres
};
# settings are written directly to the `app.ini` config file
# refer to: https://forgejo.org/docs/latest/admin/config-cheat-sheet/
settings = {
server = {
# ENABLE_ACME = true;
# ACME_EMAIL = "eclarkboman@gmail.com"; # change this to "me@imbored.dev"
DOMAIN = "forge.imbored.dev"; # should this be "imbored.dev"?
ROOT_URL = "https://forge.imbored.dev"; # full public URL of the Forgejo server
# address and port to listen on
HTTP_ADDR = "127.0.0.1";
HTTP_PORT = 3000;
PROTOCOL = "http"; # http internally, reverse proxy uses https externally
START_SSH_SERVER = true;
DISABLE_SSH = false;
SSH_PORT = 2222;
};
DEFAULT = {
APP_NAME = "tearforge";
APP_SLOGIN = "but cozy";
APP_DISPLAY_NAME_FORMAT = "{APP_NAME} ::{APP_SLOGAN}::";
};
repository = {
DEFAULT_PRIVATE = "private"; # last, private, public
# repo/org created on push to non-existent
ENABLE_PUSH_CREATE_USER = true;
ENABLE_PUSH_CREATE_ORG = false;
DEFAULT_PUSH_CREATE_PRIVATE = true;
MAX_CREATION_LIMIT = -1;
};
"repository.upload" = {
# max per-file size in MB
FILE_MAX_SIZE = 50;
# max number of files per upload
MAX_FILES = 5;
};
badges = let
# flat, flat-square, plastic, for-the-badge, social
style = "for-the-badge";
in {
ENABLED = true;
GENERATOR_URL_TEMPLATE = "https://img.shields.io/badge/{{.label}}-{{.text}}-{{.color}}?style=${style}";
};
ui = {
DEFAULT_THEME = "forgejo-dark";
THEMES = "forgejo-auto,forgejo-light,forgejo-dark";
};
"ui.meta" = {
AUTHOR = "Emile Clark-Boman - emileclarkb";
DESCRIPTION = "This is my personal self-hosted git forge, where I keep and maintain personal projects! PS do butterflies cry when they're sad?";
KEYWORDS = "emile,clark,boman,clarkboman,emileclarkb,git,forge,forgejo,self-hosted,dobutterfliescry,butterfly,butterflies";
};
markdown = {
ENABLE_HARD_LINE_BREAK_IN_COMMENTS = true;
ENABLE_MATH = true;
};
admin = {
DEFAULT_EMAIL_NOTIFICATIONS = "enabled";
SEND_NOTIFICATION_EMAIL_ON_NEW_USER = true;
};
security = {
# Controls access to the installation page.
# When set to “true”, the installation page is not accessible.
#INSTALL_LOCK = false;
PASSWORD_HASH_ALGO = "argon2"; # ARGON2 BEST ALGO FR!! (default: argon2$2$65536$8$50)
MIN_PASSWORD_LENGTH = 12;
PASSWORD_COMPLEXITY = "lower,upper,digit,spec";
PASSWORD_CHECK_PWN = true;
};
service = {
DISABLE_REGISTRATION = true; # toggle for new users
#DEFAULT_USER_IS_RESTRICTED = true;
# Forbid login with third-party services (ie github)
ALLOW_ONLY_INTERNAL_REGISTRATION = true;
ENABLE_CAPTCHA = true;
REQUIRE_CAPTCHA_FOR_LOGIN = true;
REQUIRE_EXTERNAL_REGISTRATION_CAPTCHA = true;
LOGIN_REMEMBER_DAYS = 365;
ENABLE_NOTIFY_MAIL = true;
};
"service.explore" = {
REQUIRE_SIGNIN_VIEW = false;
DISABLE_USERS_PAGE = false;
DISABLE_ORGANIZATIONS_PAGE = false;
DISABLE_CODE_PAGE = false;
};
cache = {
ADAPTER = "twoqueue";
HOST = "{\"size\":100, \"recent_ratio\":0.25, \"ghost_ratio\":0.5}";
ITEM_TTL = "16h";
};
# TODO: fill this in once my mail server is configured
# email.incoming = { ... };
# optional
# TODO: fill this in once my mail server is configured
mailer = {
ENABLED = false;
SMTP_ADDR = "mail.imbored.dev";
FROM = "noreply@imbored.dev";
USER = "noreply@imbored.dev";
};
log = {
MODE = "file";
LEVEL = "Info"; # "Trace", "Debug", "Info", "Warn", "Error", "Critical"
ENABLE_SSH_LOG = true;
};
cron = {
ENABLED = true;
RUN_AT_START = false;
};
other = {
SHOW_FOOTER_VERSION = true;
SHOW_FOOTER_TEMPLATE_LOAD_TIME = true;
SHOW_FOOTER_POWERED_BY = true;
ENABLE_SITEMAP = true;
ENABLE_FEED = true;
};
};
};
};
security = {
# accept Lets Encrypt's security policy (for nginx)
acme = {
acceptTerms = true;
# TODO: change this to me@imbored.dev
defaults.email = "eclarkboman@gmail.com";
};
sudo = {
enable = true;
wheelNeedsPassword = true;
};
# allow SSH keys for passwordless auth
# TODO: DO NOT USE THIS (create my own alternative to colmena)
pam = {
enableSSHAgentAuth = true;
services.sudo.sshAgentAuth = true; # pam_ssh_agent_auth module
};
};
environment.systemPackages = with pkgs; [
git
vim
helix
];
programs = {
fish.enable = true;
bash = {
completion.enable = true;
interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
};
};
system.stateVersion = "24.11"; # DO NOT MODIFY system.stateVersion = "24.11"; # DO NOT MODIFY
} }

View file

@ -0,0 +1,7 @@
{...}: {
imports = [
./services/forgejo.nix
./services/vaultwarden.nix
./services/nginx.nix
];
}

View file

@ -0,0 +1,83 @@
{
inputs,
pkgs,
...
}: {
nixpkgs.overlays = [
(self: super: {
# in wake of CVE-2022-3602/CVE-2022-3786
nginxStable = super.nginxStable.override {openssl = pkgs.libressl;};
})
inputs.dobutterfliescry-net.overlays.default
];
# simple nginx instance to host static construction page
# TODO: I want sshd and forgejo's ssh server to both be bound to port 22
# So change sshd to listen on a different address/port (ie 2222 or 127.0.0.3:22, etc)
# and change forgejo to use 127.0.0.2:22 (use port 22, ONLY change loopback address)
services.nginx = {
enable = true;
# XXX: TODO: this should auto use the nginxStable overlay no?
# in wake of CVE-2022-3602/CVE-2022-3786
# package = pkgs.nginxStable.override {openssl = pkgs.libressl;};
recommendedGzipSettings = true;
recommendedZstdSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
# streamConfig = ''
# server {
# listen 127.0.0.1:53 udp reuseport;
# proxy_timeout 20s;
# proxy_pass 192.168.0.1:53535;
# }
# '';
virtualHosts = let
localhost = "http://127.0.0.1";
std = {
# TODO: should I run over QUIC+HTTP3? (experimental)
# quic = true;
# http3 = true;
enableACME = true;
# kTLS = true; # offload TLS to the linux kernel
};
vault =
{
forceSSL = true;
locations."/".proxyPass = "${localhost}:8222";
}
// std;
forge =
{
forceSSL = true;
extraConfig = ''
client_max_body_size 512M;
'';
locations."/".proxyPass = "${localhost}:3000";
}
// std;
in {
"dobutterfliescry.net" =
{
default = true;
addSSL = true; # not strictly enforced <3
# root = "/var/www/cry";
root = "${pkgs.dobutterfliescry-net}/www";
# extraConfig = ''
# error_page 404 /custom_404.html;
# '';
}
// std;
# Route "vault" subdomain to vaultwarden
"vault.imbored.dev" = vault;
# Route "forge" subdomain to forgejo
# TODO: use `forgejo.settings.server.ENABLE_ACME` instead?
# "tearforge.net" = forge;
"forge.dobutterfliescry.net" = forge;
};
};
}

View file

@ -1,424 +1,20 @@
{ {...}: {
lib,
pkgs,
pkgs-unstable,
inputs,
config,
...
}: let
home-manager = builtins.fetchTarball {
url = "https://github.com/nix-community/home-manager/archive/release-25.05.tar.gz";
sha256 = "1y919cqrlmq0k44rgnacaq4zq37jj4rdh6f2swp6y2jiz28xb0iq";
};
in {
imports = [ imports = [
./hardware-configuration.nix ./hardware-configuration.nix
(import "${home-manager}/nixos")
../modules/wm/hyprland.nix
# ../modules/wm/river.nix
../modules/wm/crywl.nix
../modules/steam.nix
../modules/obsidian.nix
../modules/angryoxide.nix
../modules/flipperzero.nix
../modules/chameleonultragui.nix
]; ];
nix.settings.experimental-features = [ networking.hostName = "lolcathost";
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfreePredicate = let
whitelist = map lib.getName [
pkgs.obsidian
pkgs.gitkraken
pkgs.steam
pkgs.steamcmd
pkgs.steam-unwrapped
pkgs.dwarf-fortress
];
in
pkg: builtins.elem (lib.getName pkg) whitelist;
boot.loader = {
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot/efi";
};
grub = {
efiSupport = true;
device = "nodev";
useOSProber = false;
};
# GitHub: vinceliuice/grub2-themes
grub2-theme = {
enable = true;
theme = "whitesur"; # stylish, vimix, or whitesur
footer = true;
customResolution = "1920x1080";
};
};
time.timeZone = "Australia/Brisbane";
i18n.defaultLocale = "en_US.UTF-8"; # internationalisation
# Enable initrd hook for virtual console customisation
# aka cool colours when bootting yay!!
console = {
enable = true;
earlySetup = true; # initrd pre hook
keyMap = "us";
font = "Lat2-Terminus16";
# ANSI 24-bit color definitions (theme: dracula)
colors = [
"21222c"
"ff5555"
"50fa7b"
"f1fa8c"
"bd93f9"
"ff79c6"
"8be9fd"
"f8f8f2"
"6272a4"
"ff6e6e"
"69ff94"
"ffffa5"
"d6acff"
"ff92df"
"a4ffff"
"ffffff"
];
};
# ----- NETWORKING -----
networking = {
hostName = "lolcathost";
networkmanager.enable = true;
firewall.enable = false;
};
# ----- SERVICES ----- # ----- SERVICES -----
services = { services = {
# Set display manager (login screen) # dbus = {
displayManager = { # # NOTE: programs.uwsm.enable sets implementation to dbus-broker,
# sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects # # NOTE: however this seems to break dbus
sddm = { # implementation = lib.mkForce "dbus";
enable = true; # };
wayland.enable = true; # experimental
theme = "corners";
};
defaultSession =
"hyprland"
+ (
if config.programs.hyprland.withUWSM == true
then "-uwsm"
else null
);
};
dbus = {
# NOTE: programs.uwsm.enable sets implementation to dbus-broker,
# NOTE: however this seems to break dbus
implementation = lib.mkForce "dbus";
};
# Multimedia Framework
# With backwards compatability for alsa/pulseaudio/jack
pipewire = {
enable = true;
wireplumber.enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
# Touchpad support # Touchpad support
libinput.enable = true; libinput.enable = true;
tumbler.enable = true; # Thunar image thumbnail support
gvfs.enable = true; # Thunar mount, trash, and other functionality
};
security.rtkit.enable = true; # I *think* this is for pipewire
# ------- USERS -------
users = {
# Using fish as the login shell tends to go very poorly because it isn't
# POSIX compliant, so we default the login shell to Bash instead :)
defaultUserShell = pkgs.bash;
users = {
# literally me fr (personal account)
me = {
isNormalUser = true;
extraGroups = ["wheel" "netdev" "docker"];
shell = pkgs.bash;
packages = let
# TODO: can I just do this: https://nix.dev/manual/nix/2.18/command-ref/new-cli/nix3-flake#url-like-syntax
# instead to use colmena's flake.nix by specifying a rev hash in the flake input?
colmena-src = pkgs.fetchFromGitHub {
owner = "zhaofengli";
repo = "colmena";
rev = "47b6414d800c8471e98ca072bc0835345741a56a";
sha256 = "rINodqeUuezuCWOnpJgrH7u9vJ86fYT+Dj8Mu8T/IBc=";
};
colmena-latest = pkgs.callPackage "${colmena-src}/package.nix" {};
in
with pkgs; [
firefox
nitch
starfetch
colmena-latest
gitkraken
];
};
# user for friends to ssh into
friends = {
isNormalUser = true;
shell = pkgs.fish;
};
};
};
home-manager = {
users.me = import ../../homes/me;
extraSpecialArgs = {inherit inputs pkgs pkgs-unstable;};
sharedModules = [
inputs.ags.homeManagerModules.default
];
};
# ---- ENVIRONMENT VARIABLES ----
environment.sessionVariables = {
# folder names with capitalisation look awful!
XDG_DOWNLOAD_DIR = "$HOME/downloads";
# Hint Electrons apps to use Wayland
NIXOS_OZONE_WL = "1";
};
# ---- SYSTEM PACKAGES -----
environment.systemPackages = with pkgs; [
# User Environment
# crywl
swww
helvum
easyeffects
pavucontrol
ani-cli
bluetui
wl-clipboard # clipboard for wayland
qbittorrent # torrenting
signal-desktop
(callPackage ../sddm-theme-corners.nix {}).sddm-theme-corners
# dependencies for my sddm theme:
pkgs.libsForQt5.qt5.qtgraphicaleffects
# Shell
bash
fish
shellcheck
grc # colorise command outputs
# Systems Emulation
qemu # Fellice Bellard's Quick Emulator
# GNU Utils
gnumake
binutils
# C Family
gcc
clang
clang-tools
# Rust
cargo
rustc
# Nim
nim
# Go
go
# Python
python312 # I use 3.12 since it's in a pretty stable state now
python314 # also 3.14 for latest features
poetry
# Sage
sageWithDoc # SageMath + HTML Documentation
openvpn
inetutils
# security tools
rustscan
nmap
dig
gobuster
nth
zap
httpie
curlie
zoxide
doggo
tldr
# btop
eza
yazi
lazygit
ripgrep
viddy # modern `watch` command
thefuck
# TODO: once upgraded past Nix-24.07 this line won't be necessary (I think)
# helix will support nixd by default
# SOURCE: https://github.com/nix-community/nixd/blob/main/nixd/docs/editor-setup.md#Helix
nixd # lsp for nix
# Pretty necessary
git
git-filter-repo
nix-prefetch-git
brightnessctl
acpi
# upower
vim
powertop
imagemagick
# "Standard" Unix Commands
file
wget
tree
unzip
unrar-free
man-pages
man-pages-posix
# Cryptography
gnupg
openssl
libargon2
# Games
mindustry
dwarf-fortress
prismlauncher # minecraft
];
programs = {
crywl = {
enable = true;
xwayland.enable = false;
defaultSession = false;
useUnmodifiedDWL = false;
};
fish.enable = true;
nix-ld.enable = true;
# I want to use fish as my login shell but it always goes terrible
# cause it isn't POSIX compliant, so instead Bash is my login and
# will just exec fish (^-^)
bash = {
blesh.enable = false; # ble.sh replacement for GNU readline
completion.enable = true;
interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
};
# Thunar also uses: `services.tumbler` & `services.gvfs`
thunar = {
enable = true;
plugins = with pkgs.xfce; [
thunar-volman # for removable drives (ie USBs)
thunar-archive-plugin # create and extract archives
thunar-media-tags-plugin # change metadata for media files
];
};
# mozilla's email client
thunderbird.enable = true;
};
# ----- FONTS -----
fonts = {
enableDefaultPackages = true; # no clue what this line does tbh
packages = with pkgs;
[
#(nerdfonts.override {
# fonts = [
# "Cousine"
# "Iosevka"
# "JetBrainsMono"
# ];
# })
geist-font # for my hyprlock theme
# texlive maintains a noto-emoji flake
texlivePackages.noto-emoji
]
++ builtins.filter lib.attrsets.isDerivation (
builtins.attrValues pkgs.nerd-fonts
);
# TODO: change my default fonts
fontconfig = {
defaultFonts = {
serif = ["Geist"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font
sansSerif = ["Geist"];
monospace = ["Cousine"];
emoji = ["Noto Emoji"];
};
};
};
documentation = {
enable = true;
doc.enable = true; # install /share/doc packages
man.enable = true; # install manpages
info.enable = true; # install GNU info
dev.enable = true; # install docs intended for developers
nixos = {
enable = true; # install NixOS documentation (ie man -k nix, & nixos-help)
options.splitBuild = true;
# includeAllModules = true;
};
};
virtualisation.docker.enable = true;
hardware = {
graphics = {
enable = true;
enable32Bit = true;
};
# opengl = {
# enable = true;
# driSupport = true;
# driSupport32Bit = true;
# }
bluetooth = {
enable = true;
powerOnBoot = true;
};
}; };
# DO NOT MODIFY # DO NOT MODIFY

View file

@ -1,5 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
(callPackage ../packages/angryoxide {})
];
}

View file

@ -0,0 +1,25 @@
{
pkgs,
upkgs,
dotnetVersions ? [8 9 10],
...
}: {
imports = [
../langs/dotnet.nix
];
environment.systemPackages = with pkgs; [
# Ensure latest stable Rider version (not necessarily stable on NixOS)
upkgs.jetbrains.rider
# NOTE: Blazor requires a Chromium-based browser
chromium
];
programs.nix-ld = {
enable = true;
libraries = with pkgs; [
icu
];
};
}

View file

@ -0,0 +1,6 @@
{...}: {
programs.winbox = {
enable = true;
openFirewall = false; # port: 5678
};
}

View file

@ -0,0 +1,27 @@
{pkgs, ...}: {
# I want to use fish as my login shell but it always goes terrible
# cause it isn't POSIX compliant, so instead Bash is my login and
# will just exec fish (^-^)
programs = {
fish.enable = true;
bash = {
blesh.enable = false; # ble.sh replacement for GNU readline
completion.enable = true;
interactiveShellInit = ''
# help bash transition into a beautiful fish!
if [[ -z $CRY_BASH_IS_TRANS ]]
then
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
fi
# bash is trans now! (no more transitioning required)
export CRY_BASH_IS_TRANS=true
'';
};
};
}

View file

@ -1,5 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
(callPackage ../packages/chameleonultragui {})
];
}

View file

@ -1,29 +0,0 @@
{
lib,
pkgs,
config,
inputs,
outputs,
...
}:
{
imports = [
config.nixcord.homeManagerModules.nixcord
];
programs.nixcord = {
enable = true;
config = {
#themeLinks = [
# ""
#];
# no surrounding window frame
frameless = true;
plugins = {
};
};
};
}

View file

@ -1,31 +0,0 @@
#### wishlist.nix
This is a simple Nix flake defining a service from which
wishlist can run automatically. This flake runs wishlist-0.15.1
and lacks configurability unfortunately. However this was an
intentional choice, allowing wishlist to read from the user's
`~/.ssh/config` file, which can be configured seperately using
the something akin to the follow home-manager snippet:
```nix
programs.ssh = {
enable = true;
addKeysToAgent = "yes"; # always add keys to ssh-agent
matchBlocks = {
hyrule = {
hostname = "imbored.dev";
user = "ae";
port = 22;
identityFile = "/home/me/.ssh/id_hyrule";
};
};
};
```
This decision was mostly selfish as it was easiest...
But it comes at the cost of not being able to set the
port wishlist listens on. So for now you're stuck with `2222`.
###### The Future!! (woooowwww)
Create an option for wishlist that is used to construct
the `config.yaml` file

View file

@ -1,93 +0,0 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = {
self,
config,
nixpkgs,
lib,
flake-utils,
}: let
cfg = config.services.wishlist;
supportedSystems = ["x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];
in {
# TODO: 1. add options (ie one to set whether the server should be enabled),
# 2. create a systemd service
# 3. create a main program
# 4. celibrate
# TODO: do I need to make this a home-manager option and set the yaml config?
# define what settings a user can change
options = {
services.wishlist = with lib; {
enable = mkEnableOption "wishlist";
port = mkOption {
type = types.port;
default = 2222;
description = "Port to listen on";
};
package = mkOption {
type = types.package;
default = self.packages.${nixpkgs.system}.default;
description = "Package to use";
};
};
};
# define a systemd service for wishlist ^_^
config = lib.mkIf cfg.enable {
systemd.services.wishlist = {
description = "Single entrypoint for multiple SSH endpoints";
wantedBy = ["multi-user.target"];
serviceConfig = {
DynamicUser = "yes";
ExecStart = "${cfg.package}/bin/wishlist serve";
Restart = "always";
RestartSec = "2s";
};
};
};
packages = flake-utils.lib.eachSystem supportedSystems (
system: let
version = "0.15.1";
#pkgs = nixpkgs.legacyPackages.${system};
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = false;
};
#lib = pkgs.lib;
in rec {
defaultPackage = self.packages.${system}.wishlist;
wishlist = pkgs.buildGoModule {
pname = "wishlist";
inherit version;
meta = with lib; {
description = "Single entrypoint for multiple SSH endpoints";
homepage = "https://github.com/charmbracelet/wishlist";
changelog = "https://github.com/charmbracelet/wishlist/releases/tag/v${version}";
license = licenses.mit;
maintainers = with maintainers; [caarlos0 penguwin];
mainProgram = "wishlist";
};
src = pkgs.fetchFromGitHub {
owner = "charmbracelet";
repo = "wishlist";
rev = "v${version}";
# rev = "d7f058e115a8b4a4131406d01dde84fb4a8e93c4";
hash = "53fojA+gdvpSVNjx6QncH16F8/x+lpY5SkNs7obW2XQ=";
};
vendorSha256 = "0x6rss3fwv2398wrd5kyzkrqaphzvh4ykwfqai9glxm01y6fhxz7";
};
}
);
};
}

View file

@ -1,99 +0,0 @@
# NOTE: Wishlist service fails on nix because of readonly file system
# and it can't find a config file for itself, it needs to write that
# itself I suppose :(
# So:
# 1. Get it to write that file, and
# 2. Allow it to inherit profiles from configured ssh
{
self,
config,
pkgs,
lib,
}: let
cfg = config.services.wishlist;
in {
options = {
services.wishlist = with lib; {
enable = mkEnableOption "wishlist";
name = mkOption {
type = types.str;
default =
};
port = mkOption {
type = types.port;
default = 2222;
description = "Port to listen on";
};
#configPath = mkOption {
# type = types.path;
# default = ;
# description = "Path to config file";
#};
package = mkOption {
type = types.package;
default = self.packages.${nixpkgs.system}.default;
description = "Package to use";
};
};
};
# define a systemd service for wishlist ^_^
config = lib.mkIf cfg.enable {
systemd.services.wishlist = {
description = "Single entrypoint for multiple SSH endpoints";
wantedBy = ["multi-user.target"];
serviceConfig = let
wishlistServiceConfig = pkgs.writeText "config.yaml" ''
hello world!
'';
in {
DynamicUser = "yes";
ExecStart = "${pkgs.wishlist}/bin/wishlist serve --config ${wishlistServiceConfig}";
Restart = "always";
RestartSec = "2s";
};
};
};
/*
packages = flake-utils.lib.eachSystem supportedSystems (
system: let
version = "0.15.1";
#pkgs = nixpkgs.legacyPackages.${system};
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = false;
};
#lib = pkgs.lib;
in rec {
defaultPackage = self.packages.${system}.wishlist;
wishlist = pkgs.buildGoModule {
pname = "wishlist";
inherit version;
meta = with lib; {
description = "Single entrypoint for multiple SSH endpoints";
homepage = "https://github.com/charmbracelet/wishlist";
changelog = "https://github.com/charmbracelet/wishlist/releases/tag/v${version}";
license = licenses.mit;
maintainers = with maintainers; [caarlos0 penguwin];
mainProgram = "wishlist";
};
src = pkgs.fetchFromGitHub {
owner = "charmbracelet";
repo = "wishlist";
rev = "v${version}";
# rev = "d7f058e115a8b4a4131406d01dde84fb4a8e93c4";
hash = "53fojA+gdvpSVNjx6QncH16F8/x+lpY5SkNs7obW2XQ=";
};
vendorSha256 = "0x6rss3fwv2398wrd5kyzkrqaphzvh4ykwfqai9glxm01y6fhxz7";
};
}
);
*/
}

View file

@ -1,6 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
# flipper zero desktop app
qflipper
];
}

View file

@ -0,0 +1,61 @@
{
lib,
pkgs,
upkgs,
...
}: let
dotnetVersions = [8 9 10];
dotnetCombined =
pkgs.dotnetCorePackages.combinePackages
(builtins.concatMap
(v: let
# dotnet = pkgs.dotnetCorePackages."dotnet_${builtins.toString x}";
in [
# dotnet.sdk
# the runtime+aspnetcore packaged with the sdk
pkgs.dotnetCorePackages."sdk_${builtins.toString v}_0"
])
dotnetVersions);
# Custom packaged tools
dotnetTools = with lib; {
uno-check = with pkgs.dotnetCorePackages;
buildDotnetGlobalTool {
pname = "Uno.Check";
version = "1.32.17";
nugetHash = "sha256-BfTVF5uHu9/nyLXqdDEOHCxq6BVQWhsnDBbARzdLDAE=";
executables = "uno-check";
dotnet-sdk = dotnet_9.sdk;
dotnet-runtime = dotnet_9.runtime;
meta = {
homepage = "https://github.com/unoplatform/uno.check";
license = licenses.mit;
maintainers = [maintainers.emileclarkb];
};
};
};
in {
environment.systemPackages = with pkgs; [
# .NET
dotnetCombined
# .NET Tools
dotnetTools.uno-check
# Mono
mono
# NOTE: nixupkgs uses .NET8 SDK
# WARNING: nixpkgs-25.05 uses .NET6 SDK (now marked insecure)
upkgs.msbuild
# .NET Framework Tools/Services
omnisharp-roslyn
netcoredbg
];
}

View file

@ -3,22 +3,38 @@
lib, lib,
... ...
}: { }: {
nixpkgs.config.allowUnfreePredicate = pkg: # nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (lib.getName pkg) [ # builtins.elem (lib.getName pkg) [
"steam" # "steam"
"steam-original" # "steam-original"
"steam-unwrapped" # "steam-unwrapped"
"steam-run" # "steam-run"
# ];
nixpkgs.overlays = [
(self: super: {
lutris = super.lutris.overrideAttrs (final: prev: {
# WARNING: pkgs.mbedtls_2 is marked insecure!
# Replace pkgs.mbedtls_2 (v2.28.10) with pkgs.mbedtls (v3.6.4)
targetPkgs = pkgs: (
(builtins.filter (p: p != pkgs.mbedtls_2) (prev.targetPkgs pkgs))
++ [pkgs.mbedtls]
);
});
})
]; ];
programs = { programs = {
steam = { steam = {
enable = true; enable = true;
gamescopeSession.enable = true; gamescopeSession.enable = false; # .desktop entry for gamescope
remotePlay.openFirewall = true; remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true; dedicatedServer.openFirewall = true;
localNetworkGameTransfers.openFirewall = true; localNetworkGameTransfers.openFirewall = true;
extraCompatPackages = with pkgs; [
proton-ge-bin
];
}; };
gamemode.enable = true; gamemode.enable = true;
@ -29,7 +45,12 @@
mangohud mangohud
protonup-qt protonup-qt
lutris
# XXX: DEBUG: disable lutris
# XXX: NOTE: pkgs.lutris depends on pkgs.mbedtls_2 which is marked insecure!
# XXX: NOTE: Use the provided overlay to patch pkgs.mbedtls_2 -> pkgs.mbedtls
# lutris
bottles bottles
heroic heroic
]; ];

View file

@ -1,72 +0,0 @@
{
description = "Wishlist: Your SSH directory."
inputs = {
};
outputs = {
self
}: let
nixosModule = {
config,
lib,
pkgs,
...
}: {
options.services.wishlist = {
enable = lib.mkEnableOption "Your SSH directory.";
port = lib.mkOption {
type = lib.types.port;
default = 22;
description = "Port to listen on";
};
};
config = lib.mkIf config.services.wishlist.enable {
# configure the systemd service
systemd.services.wishlist = {
description = "Your SSH directory.";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
ExecStart = "${self.packages.${pkgs.system}.default}/bin/wishlist";
Restart = "always";
Type = "simple";
DynamicUser = "yes";
};
# environment variables
environment = {
};
};
};
};
in
(flake-utils.lib.eachDefaultSystem (system: let
gopkg = go-nixpkgs.legacyPackages.${system};
in {
packages.default = gopkg.buildGoModule ############################
}))
buildGoModule rec { # is rec necessary?
pname = "wishlist";
version = "0.15.1"
src = fetchFromGithub {
owner = "charmbracelet";
repo = "wishlist";
rev = "v${version}";
hash = "0c9g1s8j9znzd1mw61d0klc6sqri0wx6hljibxdwzi3cabfy3ld6";
};
vendorSha256 = lib.fakeSha256;
meta = with lib; {
homepage = "https://github.com/charmbracelet/wishlist";
description = "Your SSH directory.";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ caarlos0 ];
};
};
}

View file

@ -1,22 +0,0 @@
{lib}: {
buildGoModule rec { # is rec necessary?
pname = "wishlist";
version = "0.15.1"
src = fetchFromGithub {
owner = "charmbracelet";
repo = "wishlist";
rev = "v${version}";
hash = "0c9g1s8j9znzd1mw61d0klc6sqri0wx6hljibxdwzi3cabfy3ld6";
};
vendorSha256 = lib.fakeSha256;
meta = with lib; {
homepage = "https://github.com/charmbracelet/wishlist";
description = "Your SSH directory.";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ caarlos0 ];
};
};
}

View file

@ -1,116 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.programs.crywl;
in {
options.programs.crywl = with lib; {
enable = mkEnableOption "CryWL";
xwayland.enable = mkEnableOption "XWayland";
defaultSession = mkEnableOption "CryWL as the default login session";
# currently DWL 0.7 (also beware I'll barely ever update the original DWL refs)
useUnmodifiedDWL = mkOption {
type = types.bool;
default = false;
description = "Whether to use unmodified DWL source code (latest stable release)";
};
};
config = lib.mkIf cfg.enable (let
xwaylandEnabled = cfg.xwayland.enable;
defaultSession = cfg.defaultSession;
useUnmodifiedDWL = cfg.useUnmodifiedDWL;
in {
services.displayManager = {
sessionPackages = [
pkgs.crywl
];
defaultSession = lib.mkIf defaultSession "crywl";
};
environment.systemPackages = [
pkgs.crywl
];
nixpkgs.overlays = [
(self: super: {
crywl = super.dwl.overrideAttrs (oldAttrs: rec {
pname = "crywl";
version = "0.1-unstable";
src = let
dwl_0_70 = {
rev = "74e45c4014ae7048ecbb76eb6f54034b8b479480";
hash = "sha256-7SoCITrbMrlfL4Z4hVyPpjB9RrrjLXHP9C5t1DVXBBA=";
};
crywl_unstable = {
rev = "dc1260d3cfd14e8e5b243ec1d3d56e4b08c8c517";
hash = "sha256-61R+xBYMzeEn93gLofcj8Y3VbJqW6g7GzCTujpAco90=";
};
in
pkgs.fetchFromGitea ({
domain = "forge.imbored.dev";
owner = "emileclarkb";
repo = pname;
}
// (
if useUnmodifiedDWL
then dwl_0_70
else crywl_unstable
));
buildInputs = with pkgs;
[
libinput
xorg.libxcb
libxkbcommon
pixman
wayland
wayland-protocols
wlroots_0_19
]
++ lib.optionals xwaylandEnabled [
xorg.libX11
xorg.xcbutilwm
xwayland
];
makeFlags =
[
"PKG_CONFIG=${pkgs.stdenv.cc.targetPrefix}pkg-config"
"WAYLAND_SCANNER=wayland-scanner"
"PREFIX=$(out)"
"MANDIR=$(man)/share/man"
]
++ lib.optionals xwaylandEnabled [
''XWAYLAND="-DXWAYLAND"''
''XLIBS="xcb xcb-icccm.pc"''
];
# Ensure `crywl.desktop` entry is registered
passthru = {
providedSessions = [pname];
tests.version = pkgs.testers.testVersion {
package = oldAttrs.finalPackage;
# `dwl -v` emits its version string to stderr and returns 1
command = "crywl -v 2>&1; return 0";
};
};
meta = {
homepage = "https://forge.imbored.dev/emileclarkb/crywl";
description = "Personal fork of DWL";
license = lib.licenses.gpl3Only;
maintainers = [lib.maintainers.emileclarkb];
inherit (pkgs.wayland.meta) platforms;
mainProgram = "crywl";
};
});
})
];
});
}

View file

@ -1,4 +1,8 @@
{...}: { {pkgs, ...}: {
environment.defaultPackages = with pkgs; [
hyprsunset
];
programs = { programs = {
hyprland = { hyprland = {
enable = true; enable = true;

View file

@ -1,5 +0,0 @@
{...}: {
programs = {
river.enable = true;
};
}

View file

@ -1,165 +1,41 @@
{ {
lib,
pkgs, pkgs,
inputs, upkgs,
config,
... ...
}: let }: {
home-manager = builtins.fetchTarball {
url = "https://github.com/nix-community/home-manager/archive/release-25.05.tar.gz";
sha256 = "026rvynmzmpigax9f8gy9z67lsl6dhzv2p6s8wz4w06v3gjvspm1";
};
in {
imports = [ imports = [
./hardware-configuration.nix ./hardware-configuration.nix
(import "${home-manager}/nixos")
../modules/wm/hyprland.nix
../modules/steam.nix
../modules/obsidian.nix
../modules/flipperzero.nix
../modules/chameleonultragui.nix
]; ];
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfreePredicate = let
whitelist = map lib.getName [
pkgs.obsidian
pkgs.gitkraken
pkgs.steam
pkgs.steamcmd
pkgs.steam-unwrapped
pkgs.dwarf-fortress
];
in
pkg: builtins.elem (lib.getName pkg) whitelist;
boot.loader = {
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot/efi";
};
grub = {
efiSupport = true;
device = "nodev";
# useOSProber = true;
};
# GitHub: vinceliuice/grub2-themes
grub2-theme = {
enable = true;
theme = "whitesur"; # stylish, vimix, or whitesur
footer = true;
# TODO: switch my cables to switch default grub display
customResolution = "3840x2160";
};
};
time.timeZone = "Australia/Brisbane";
i18n.defaultLocale = "en_US.UTF-8"; # internationalisation
# Enable initrd hook for virtual console customisation
# aka cool colours when bootting yay!!
console = {
enable = true;
earlySetup = true; # initrd pre hook
keyMap = "us";
font = "Lat2-Terminus16";
# ANSI 24-bit color definitions (theme: dracula)
colors = [
"21222c"
"ff5555"
"50fa7b"
"f1fa8c"
"bd93f9"
"ff79c6"
"8be9fd"
"f8f8f2"
"6272a4"
"ff6e6e"
"69ff94"
"ffffa5"
"d6acff"
"ff92df"
"a4ffff"
"ffffff"
];
};
# ----- NETWORKING -----
networking = { networking = {
hostName = "myputer"; hostName = "myputer";
networkmanager.enable = true;
firewall.enable = true; firewall = {
allowedTCPPorts = [
22 # SSH
80 # HTTP
443 # HTTPS
5678 # MikroTik WinBox
25565 # Minecraft LAN
];
};
}; };
# ----- SERVICES ----- # ----- SERVICES -----
services = { services = {
# Set display manager (login screen) flatpak.enable = true;
displayManager = {
# sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects
sddm = {
enable = true;
wayland.enable = true; # experimental
theme = "corners";
}; };
defaultSession =
"hyprland"
+ (
if config.programs.hyprland.withUWSM
then "-uwsm"
else null
);
};
# Multimedia Framework
# With backwards compatability for alsa/pulseaudio/jack
pipewire = {
enable = true;
wireplumber.enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
tumbler.enable = true; # Thunar image thumbnail support
gvfs.enable = true; # Thunar mount, trash, and other functionality
};
security.rtkit.enable = true; # I *think* this is for pipewire
# ------- USERS ------- # ------- USERS -------
security.sudo.wheelNeedsPassword = false; security.sudo.wheelNeedsPassword = false;
users = { users = {
# Using fish as the login shell tends to go very poorly because it isn't
# POSIX compliant, so we default the login shell to Bash instead :)
defaultUserShell = pkgs.bash;
users = { users = {
# just me fr (personal account) # just me fr (personal account)
me = { me = {
isNormalUser = true; isNormalUser = true;
extraGroups = ["wheel" "netdev" "docker"]; extraGroups = ["wheel" "netdev" "docker"];
shell = pkgs.bash; shell = pkgs.bash;
packages = let packages = with pkgs; [
# TODO: can I just do this: https://nix.dev/manual/nix/2.18/command-ref/new-cli/nix3-flake#url-like-syntax
# instead to use colmena's flake.nix by specifying a rev hash in the flake input?
colmena-src = pkgs.fetchFromGitHub {
owner = "zhaofengli";
repo = "colmena";
rev = "47b6414d800c8471e98ca072bc0835345741a56a";
sha256 = "rINodqeUuezuCWOnpJgrH7u9vJ86fYT+Dj8Mu8T/IBc=";
};
colmena-latest = pkgs.callPackage "${colmena-src}/package.nix" {};
in
with pkgs; [
firefox firefox
nitch nitch
starfetch starfetch
@ -171,137 +47,18 @@ in {
#keyguard # bitwarden client app #keyguard # bitwarden client app
]; ];
}; };
# user for my professional jobs and stuff
ae = {
isNormalUser = true;
extraGroups = ["wheel"];
shell = pkgs.bash;
}; };
}; };
};
home-manager = {
users.me = import ../../homes/me;
sharedModules = [
inputs.ags.homeManagerModules.default
];
};
# ---- ENVIRONMENT VARIABLES ----
environment.sessionVariables = {
# folder names with capitalisation look awful!
XDG_DOWNLOAD_DIR = "$HOME/downloads";
# Hint Electrons apps to use Wayland
NIXOS_OZONE_WL = "1";
};
# ---- SYSTEM PACKAGES ----- # ---- SYSTEM PACKAGES -----
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
# User Environment # User Environment
swww libreoffice
helvum
easyeffects
pavucontrol
ani-cli
bluetui
wl-clipboard # clipboard for wayland
hyprpicker
qbittorrent
signal-desktop
(callPackage ../sddm-theme-corners.nix {}).sddm-theme-corners
# dependencies for my sddm theme:
pkgs.libsForQt5.qt5.qtgraphicaleffects
# Shell
bash
fish
shellcheck
grc # colorise command outputs
# Systems Emulation
qemu # Fellice Bellard's Quick Emulator
# GNU Utils
gnumake
binutils
# C Family
gcc
clang
clang-tools
# Rust
cargo
rustc
# Nim
nim
# Go
go
# Python
python312 # I use 3.12 since it's in a pretty stable state now
python314 # also 3.14 for latest features
poetry
# Sage
sageWithDoc # SageMath + HTML Documentation
openvpn
inetutils
# security tools
rustscan
nmap
dig
gobuster
nth
zap
httpie
curlie
zoxide
doggo
tldr
# btop
eza
yazi
lazygit
ripgrep
viddy # modern `watch` command
thefuck
tesseract # for my work with Agribit
# TODO: once upgraded past Nix-24.07 this line won't be necessary (I think)
# helix will support nixd by default
# SOURCE: https://github.com/nix-community/nixd/blob/main/nixd/docs/editor-setup.md#Helix
# nixd # lsp for nix # DEBUG
# Pretty necessary
git
git-filter-repo
nix-prefetch-git
brightnessctl
acpi
vim
powertop
imagemagick
# "Standard" Unix Commands
file
wget
tree
unzip
unrar-free
man-pages
man-pages-posix
# Cryptography
gnupg
openssl
libargon2
# Games # Games
prismlauncher # minecraft prismlauncher # minecraft
upkgs.olympus # CELESTE!! <3 :3
discord
]; ];
# DEBUG: configuring xdg portal here instead? # DEBUG: configuring xdg portal here instead?
@ -320,125 +77,6 @@ in {
# ]; # ];
#}; #};
programs = {
zsh.enable = true;
fish.enable = true;
nix-ld.enable = true;
neovim = {
enable = true;
defaultEditor = true;
viAlias = true;
vimAlias = true;
configure = {
customRC = ''
set number
set tabstop=4
set shiftwidth=4
'';
};
};
# I want to use fish as my login shell but it always goes terrible
# cause it isn't POSIX compliant, so instead Bash is my login and
# will just exec fish (^-^)
bash = {
completion.enable = true;
interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
};
# Thunar also (optionally) requires: `services.tumbler` & `services.gvfs`
thunar = {
enable = true;
plugins = with pkgs.xfce; [
thunar-volman # for removable drives (ie USBs)
thunar-archive-plugin # create and extract archives
thunar-media-tags-plugin # change metadata for media files
];
};
# mozilla's email client
thunderbird.enable = true;
};
# ----- FONTS -----
fonts = {
enableDefaultPackages = true; # no clue what this line does tbh
packages = with pkgs;
[
# (nerdfonts.override {
# fonts = [
# "Cousine" # its ok i guess
# "Iosevka" # nah nah
# "IosevkaTerm" # big nah
# "CascadiaCode" # potential
# "FiraCode" # potential
# "JetBrainsMono" # for my rofi theme
# "Hasklig"
# "Hack"
# ];
# })
geist-font # for my hyprlock theme
# texlive maintains a noto-emoji flake
texlivePackages.noto-emoji
]
++ builtins.filter lib.attrsets.isDerivation (
builtins.attrValues pkgs.nerd-fonts
);
# TODO: change my default fonts
fontconfig = {
defaultFonts = {
serif = ["Iosevka"];
sansSerif = ["Iosevka "];
monospace = ["Cousine"];
emoji = ["Noto Emoji"];
};
};
};
documentation = {
enable = true;
doc.enable = true; # install /share/doc packages
man.enable = true; # install manpages
info.enable = true; # install GNU info
dev.enable = true; # install docs intended for developers
nixos = {
enable = true; # install NixOS documentation (ie man -k nix, & nixos-help)
options.splitBuild = true;
# includeAllModules = true;
};
};
virtualisation.docker.enable = true;
hardware = {
graphics = {
enable = true;
enable32Bit = true;
};
# opengl = {
# enable = true;
# driSupport = true;
# driSupport32Bit = true;
# }
bluetooth = {
enable = true;
powerOnBoot = true;
};
};
# DO NOT MODIFY # DO NOT MODIFY
system.stateVersion = "24.05"; # Did you read the comment? system.stateVersion = "24.05"; # Did you read the comment?
} }

View file

@ -1,474 +0,0 @@
{
pkgs,
lib,
...
}:
# ChameleonUltraGUI requires flutter sdk >3.0.0
pkgs.flutter324.buildFlutterApplication
(self: {
pname = "ChameleonUltraGUI";
version = "1.1.2";
src = pkgs.fetchFromGitHub {
owner = "GameTec-live";
repo = "ChameleonUltraGUI";
sha256 = "1mb6wkqk6vaamrhflfhsgp5gvqiw2qkvmy7j65abcx7sn5990i27";
rev = "11424abaccb4a010fcbeab9799ae8f675d8afe99";
};
desktopItems = [
(pkgs.makeDesktopItem {
name = self.pname;
desktopName = "Chameleon Ultra GUI";
icon = self.pname;
comment = self.meta.description;
exec = "chameleonultragui";
terminal = false;
categories = [
"Utility"
];
})
];
# path to application within fetched sources
sourceRoot = "source/chameleonultragui";
buildInputs = [
pkgs.imagemagick # creating mipmaps for share/icons
pkgs.yj # converting pubspec.lock yaml->json
];
buildArguments = ["--release"];
# source files compile with Flutter >3.29.0 but this
# derivation uses 3.24.0 (so we patch for compatability)
postPatch = let
argbPatch = ''
--- general.dart.old 2025-05-11 15:59:51.812132078 +1000
+++ general.dart 2025-05-11 15:58:14.755856407 +1000
@@ -211,7 +211,7 @@
}
String colorToHex(Color color) {
- return '#\''${color.toARGB32().toRadixString(16).padLeft(8, '0').substring(2)}';
+ return '#\''${color.value.toRadixString(16).padLeft(8, '0').substring(2)}';
}
Color hexToColor(String hex) {
'';
in ''
# patch source files using Color.toARGB32 method (not defined in Flutter 3.24)
argbPatch="${argbPatch}"
patch lib/helpers/general.dart <(echo "$argbPatch")
'';
# installPhase = ''
# runHook preInstall
# # create mipmaps of desktop logo
# logoOriginal="assets/logo-color-desktop.png"
# for i in 16 32 64 128 256 512; do
# res="$i"x"$i"
# logoOut="$out"/share/icons/hicolor/"$res"/apps
# mkdir -p $logoOut
# ${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${pname}.png
# done
# runHook postInstall
# '';
# Nix doesn't natively have a fromYAML function (so I made this instead)
pubspecLock = let
appRoot = "${self.src}/chameleonultragui";
# when generating patch files use -u flag and then
# make sure to escape all " characters for Nix string
pubspecLockPatch = ''
--- pubspec.lock.bak2025-05-10 15:42:44.287730979 +1000
+++ pubspec.lock2025-05-10 15:41:23.778480048 +1000
@@ -5,18 +5,23 @@
dependency: transitive
description:
name: _fe_analyzer_shared
- sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57
+ sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
url: \"https://pub.dev\"
source: hosted
- version: \"80.0.0\"
+ version: \"72.0.0\"
+ _macros:
+ dependency: transitive
+ description: dart
+ source: sdk
+ version: \"0.3.2\"
analyzer:
dependency: transitive
description:
name: analyzer
- sha256: \"192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e\"
+ sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
url: \"https://pub.dev\"
source: hosted
- version: \"7.3.0\"
+ version: \"6.7.0\"
archive:
dependency: \"direct main\"
description:
@@ -37,26 +42,26 @@
dependency: \"direct main\"
description:
name: async
- sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
+ sha256: \"947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c\"
url: \"https://pub.dev\"
source: hosted
- version: \"2.12.0\"
+ version: \"2.11.0\"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
- sha256: \"8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea\"
+ sha256: \"6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66\"
url: \"https://pub.dev\"
source: hosted
- version: \"2.1.2\"
+ version: \"2.1.1\"
characters:
dependency: transitive
description:
name: characters
- sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
+ sha256: \"04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.4.0\"
+ version: \"1.3.0\"
checked_yaml:
dependency: transitive
description:
@@ -77,18 +82,18 @@
dependency: transitive
description:
name: clock
- sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: \"https://pub.dev\"
source: hosted
- version: \"1.1.2\"
+ version: \"1.1.1\"
collection:
dependency: \"direct main\"
description:
name: collection
- sha256: \"2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76\"
+ sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: \"https://pub.dev\"
source: hosted
- version: \"1.19.1\"
+ version: \"1.18.0\"
convert:
dependency: \"direct main\"
description:
@@ -157,10 +162,10 @@
dependency: transitive
description:
name: fake_async
- sha256: \"6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc\"
+ sha256: \"511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.3.2\"
+ version: \"1.3.1\"
ffi:
dependency: \"direct main\"
description:
@@ -196,11 +201,10 @@
file_saver:
dependency: \"direct main\"
description:
- path: \".\"
- ref: fix-windows
- resolved-ref: \"3038d74d5560dcca528423fffd745abf31eb88ae\"
- url: \"https://github.com/Foxushka/file_saver.git\"
- source: git
+ name: file_saver
+ sha256: \"017a127de686af2d2fbbd64afea97052d95f2a0f87d19d25b87e097407bf9c1e\"
+ url: \"https://pub.dev\"
+ source: hosted
version: \"0.2.14\"
fixnum:
dependency: transitive
@@ -234,11 +238,10 @@
flutter_libserialport:
dependency: \"direct main\"
description:
- path: \".\"
- ref: main
- resolved-ref: \"6740aae075505a220a98492910b090824efc7910\"
- url: \"https://github.com/NeariX67/flutter_libserialport.git\"
- source: git
+ name: flutter_libserialport
+ sha256: d193b5ac819db6540d20cc8d20d9f5ec9e3396edb4d2c4a23c97863fa9132336
+ url: \"https://pub.dev\"
+ source: hosted
version: \"0.5.0\"
flutter_lints:
dependency: \"direct dev\"
@@ -347,18 +350,18 @@
dependency: transitive
description:
name: leak_tracker
- sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
+ sha256: \"3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05\"
url: \"https://pub.dev\"
source: hosted
- version: \"10.0.8\"
+ version: \"10.0.5\"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
+ sha256: \"932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806\"
url: \"https://pub.dev\"
source: hosted
- version: \"3.0.9\"
+ version: \"3.0.5\"
leak_tracker_testing:
dependency: transitive
description:
@@ -399,14 +402,22 @@
url: \"https://pub.dev\"
source: hosted
version: \"1.3.0\"
+ macros:
+ dependency: transitive
+ description:
+ name: macros
+ sha256: \"0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536\"
+ url: \"https://pub.dev\"
+ source: hosted
+ version: \"0.1.2-main.4\"
matcher:
dependency: transitive
description:
name: matcher
- sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
+ sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: \"https://pub.dev\"
source: hosted
- version: \"0.12.17\"
+ version: \"0.12.16+1\"
material_color_utilities:
dependency: transitive
description:
@@ -419,10 +430,10 @@
dependency: transitive
description:
name: meta
- sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
+ sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: \"https://pub.dev\"
source: hosted
- version: \"1.16.0\"
+ version: \"1.15.0\"
mobile_scanner:
dependency: \"direct main\"
description:
@@ -467,10 +478,10 @@
dependency: \"direct main\"
description:
name: path
- sha256: \"75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5\"
+ sha256: \"087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.9.1\"
+ version: \"1.9.0\"
path_provider:
dependency: transitive
description:
@@ -723,15 +734,15 @@
dependency: transitive
description: flutter
source: sdk
- version: \"0.0.0\"
+ version: \"0.0.99\"
source_span:
dependency: transitive
description:
name: source_span
- sha256: \"254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c\"
+ sha256: \"53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.10.1\"
+ version: \"1.10.0\"
sprintf:
dependency: transitive
description:
@@ -744,42 +755,42 @@
dependency: transitive
description:
name: stack_trace
- sha256: \"8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1\"
+ sha256: \"73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.12.1\"
+ version: \"1.11.1\"
stream_channel:
dependency: transitive
description:
name: stream_channel
- sha256: \"969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d\"
+ sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: \"https://pub.dev\"
source: hosted
- version: \"2.1.4\"
+ version: \"2.1.2\"
string_scanner:
dependency: transitive
description:
name: string_scanner
- sha256: \"921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43\"
+ sha256: \"556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.4.1\"
+ version: \"1.2.0\"
term_glyph:
dependency: transitive
description:
name: term_glyph
- sha256: \"7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e\"
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: \"https://pub.dev\"
source: hosted
- version: \"1.2.2\"
+ version: \"1.2.1\"
test_api:
dependency: transitive
description:
name: test_api
- sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
+ sha256: \"5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb\"
url: \"https://pub.dev\"
source: hosted
- version: \"0.7.4\"
+ version: \"0.7.2\"
typed_data:
dependency: transitive
description:
@@ -855,12 +866,11 @@
usb_serial:
dependency: \"direct main\"
description:
- path: \".\"
- ref: fix-usbserial
- resolved-ref: \"9fcbacc92bec19ea02d33a40d9f39e45d19cf637\"
- url: \"https://github.com/Foxushka/usbserial.git\"
- source: git
- version: \"0.5.1\"
+ name: usb_serial
+ sha256: a605a600e34e7f28d4e80851ca3999ef747e42e406138887b8a88b8c382a8b07
+ url: \"https://pub.dev\"
+ source: hosted
+ version: \"0.5.2\"
uuid:
dependency: \"direct main\"
description:
@@ -881,10 +891,10 @@
dependency: transitive
description:
name: vm_service
- sha256: \"0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14\"
+ sha256: \"5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d\"
url: \"https://pub.dev\"
source: hosted
- version: \"14.3.1\"
+ version: \"14.2.5\"
wakelock_plus:
dependency: \"direct main\"
description:
@@ -958,5 +968,5 @@
source: hosted
version: \"2.2.1\"
sdks:
- dart: \">=3.7.0-0 <4.0.0\"
+ dart: \">=3.5.0 <4.0.0\"
flutter: \">=3.24.0\"
'';
in
builtins.fromJSON
(
builtins.readFile (pkgs.runCommand "${self.pname}-buildenv" {
inputs = [
# DEBUG (both lines commented)
#pkgs.flutter324 # ChameleonUltraGUI requires sdk >3.0.0
#pkgs.yj
];
} ''
# copy source files to a temporary path to rebuild the lockfile
buildPath=$(mktemp -d)
cp -r "${appRoot}/." "$buildPath/"
outPubspecLock="$buildPath/pubspec.lock"
# MUST define variables to use multiline Nix string in bash scripting
pubspecLockPatch="${pubspecLockPatch}"
# apply the pubspec.yaml patch and regenerate lock file
# (create a temporary home directory for flutter to play in)
#(cd $buildPath && chmod -R +w . \
# && patch ./pubspec.yaml <(echo "$pubspecYamlPatch") \
# && export HOME=$(mktemp -d) \
# && flutter --disable-analytics \
# && flutter config --no-cli-animations \
# && ${pkgs.flutter}/bin/flutter pub get)
# patch the lockfile
chmod +w $outPubspecLock
patch $outPubspecLock <(echo "$pubspecLockPatch")
# convert new lockfile to json and return
${pkgs.yj}/bin/yj < "$buildPath/pubspec.lock" > $out
'')
);
# TODO: try this instead of patching
# gitHashes = {
# dartssh2 = "sha256-2pypKwurziwGLZYuGaxlS2lzN3UvJp3bRTvvYYxEqRI=";
# hotkey_manager_linux = "sha256-aO0h94YZvgV/ggVupNw8GjyZsnXrq3qTHRDtuhNv3oI=";
# system_info2 = "sha256-fly7E2vG+bQ/+QGzXk+DYba73RZccltdW2LpZGDKX60=";
# tray_menu = "sha256-riiAiBEms+9ARog8i+MR1fto1Yqx+gwbBWyNbNq6VTM=";
# window_size = "sha256-71PqQzf+qY23hTJvcm0Oye8tng3Asr42E2vfF1nBmVA=";
# xterm = "sha256-h8vIonTPUVnNqZPk/A4ZV7EYCMyM0rrErL9ZOMe4ZBE=";
# };
meta = with lib; {
description = "A GUI for the Chameleon Ultra written in Flutter for crossplatform";
homepage = "https://github.com/GameTec-live/ChameleonUltraGUI";
license = licenses.gpl3;
maintainers = [maintainers.emileclarkb];
platforms = platforms.linux;
};
})
.overrideAttrs (
previousAttrs: {
installPhase =
previousAttrs.installPhase
+ ''
# create mipmaps of desktop logo
logoOriginal="assets/logo-color-desktop.png"
for i in 16 32 64 128 256 512; do
res="$i"x"$i"
logoOut="$out"/share/icons/hicolor/"$res"/apps
mkdir -p $logoOut
${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${previousAttrs.pname}.png
done
'';
}
)

View file

@ -1,12 +0,0 @@
**Tundra** is the name I'm giving my *desktop environment.*
Made primarily with Aylur's Astal library and the Vala
programming language (as an excuse to learn it).
NOTE: Tundra is designed specifically to work on Hyprland,
I have no idea how it'll interact with other window managers :)
##### Meson Notes (temporary)
Setup meson like `meson setup <BUILD-DIR> <SRC-DIR>` ie `meson setup build src`.
Compile meson like `meson compile -C <BUILD-DIR>` where <BUILD-DIR> is the relative path to it,
if you're in it already just use `meson compile` otherwise if in project root use `meson compile build`.

View file

@ -1,62 +0,0 @@
{
"nodes": {
"astal": {
"inputs": {
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1745934282,
"narHash": "sha256-hgUd4yUYALHzzoEi/88BnsgrxZIqk+zyQVoI3CL61IU=",
"owner": "aylur",
"repo": "astal",
"rev": "07583deff8a486fad472718572c3248f0fbea1f3",
"type": "github"
},
"original": {
"owner": "aylur",
"repo": "astal",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1737469691,
"narHash": "sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1746663147,
"narHash": "sha256-Ua0drDHawlzNqJnclTJGf87dBmaO/tn7iZ+TCkTRpRc=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "dda3dcd3fe03e991015e9a74b22d35950f264a54",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"astal": "astal",
"nixpkgs": "nixpkgs_2"
}
}
},
"root": "root",
"version": 7
}

View file

@ -1,42 +0,0 @@
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
astal.url = "github:aylur/astal";
};
outputs = {
self,
nixpkgs,
astal,
}: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
packages.${system} = {
default = pkgs.stdenv.mkDerivation {
name = "tundra";
src = ./.;
nativeBuildInputs = with pkgs; [
meson
ninja
pkg-config
vala
gobject-introspection
dart-sass
];
buildInputs = [
astal.packages.${system}.io
astal.packages.${system}.astal3
astal.packages.${system}.battery
astal.packages.${system}.wireplumber
astal.packages.${system}.network
astal.packages.${system}.tray
astal.packages.${system}.mpris
astal.packages.${system}.hyprland
];
};
};
};
}

View file

@ -1,31 +0,0 @@
class App : Astal.Application {
public static App instance;
public override void request (string msg, SocketConnection conn) {
print(@"$msg\n");
AstalIO.write_sock.begin(conn, "ok");
}
public override void activate () {
foreach (var mon in this.monitors)
add_window(new Bar(mon));
apply_css("@STYLE@");
}
public static void main(string[] args) {
var instance_name = "vala";
App.instance = new App() {
instance_name = instance_name
};
try {
App.instance.acquire_socket();
App.instance.run(null);
} catch (Error err) {
print(AstalIO.send_request(instance_name, string.joinv(" ", args)));
}
}
}

View file

@ -1,47 +0,0 @@
project('tundra', 'vala', 'c')
bindir = get_option('prefix') / get_option('bindir')
# bindir = './bin'
libdir = get_option('prefix') / get_option('libdir')
pkgconfig_deps = [
dependency('glib-2.0'),
dependency('gobject-2.0'),
dependency('gtk+-3.0'),
dependency('libnm'),
dependency('astal-io-0.1'),
dependency('astal-3.0'),
dependency('astal-battery-0.1'),
dependency('astal-wireplumber-0.1'),
dependency('astal-network-0.1'),
dependency('astal-tray-0.1'),
dependency('astal-mpris-0.1'),
dependency('astal-hyprland-0.1'),
]
# needed for GLib.Math
deps = pkgconfig_deps + meson.get_compiler('c').find_library('m')
main = configure_file(
input: 'app.in.vala',
output: 'app.vala',
configuration: {
'STYLE': run_command(
find_program('sass'),
meson.project_source_root() / 'style.scss',
).stdout(),
},
)
sources = files(
'widget/Bar.vala',
)
executable(
'tundra',
[sources, main],
dependencies: deps,
install: true,
install_dir: bindir,
)

View file

@ -1,107 +0,0 @@
@use "sass:color";
$bg: #212223;
$fg: #f1f1f1;
$accent: #378DF7;
$radius: 7px;
window.Bar {
border: none;
box-shadow: none;
background-color: $bg;
color: $fg;
font-size: 1.1em;
font-weight: bold;
label {
margin: 0 8px;
}
.Workspaces {
button {
all: unset;
background-color: transparent;
&:hover label {
background-color: color.adjust($fg, $alpha: -0.84);
border-color: color.adjust($accent, $alpha: -0.8);
}
&:active label {
background-color: color.adjust($fg, $alpha: -0.8)
}
}
label {
transition: 200ms;
padding: 0 8px;
margin: 2px;
border-radius: $radius;
border: 1pt solid transparent;
}
.focused label {
color: $accent;
border-color: $accent;
}
}
.SysTray {
margin-right: 8px;
button {
padding: 0 4px;
}
}
.FocusedClient {
color: $accent;
}
.Media .Cover {
min-height: 1.2em;
min-width: 1.2em;
border-radius: $radius;
background-position: center;
background-size: contain;
}
.Battery label {
padding-left: 0;
margin-left: 0;
}
.AudioSlider {
* {
all: unset;
}
icon {
margin-right: .6em;
}
& {
margin: 0 1em;
}
trough {
background-color: color.adjust($fg, $alpha: -0.8);
border-radius: $radius;
}
highlight {
background-color: $accent;
min-height: .8em;
border-radius: $radius;
}
slider {
background-color: $fg;
border-radius: $radius;
min-height: 1em;
min-width: 1em;
margin: -.2em;
}
}
}

View file

@ -1,265 +0,0 @@
class Workspaces : Gtk.Box {
AstalHyprland.Hyprland hypr = AstalHyprland.get_default();
public Workspaces() {
Astal.widget_set_class_names(this, {"Workspaces"});
hypr.notify["workspaces"].connect(sync);
sync();
}
void sync() {
foreach (var child in get_children())
child.destroy();
// TODO: create a copy of workspaces
// then create a list of tuples (map id to index in hypr.workspaces)
// then sort new list by id
// then iterate and use index on hypr.workspaces
// NEVERMIND: read `lib/hyprland/hyprland.vala` and see how the
// `_workspaces` property is defined as a HashTable
// basically just extend on that / create a wrapper
// that allows better organisation
hypr.workspaces.sort((a, b) => { return a.id - b.id; });
foreach (var ws in hypr.workspaces) {
// filter out special workspaces
if (!(ws.id >= -99 && ws.id <= -2)) {
add(button(ws));
}
}
}
Gtk.Button button(AstalHyprland.Workspace ws) {
var btn = new Gtk.Button() {
visible = true,
label = ws.id.to_string()
};
hypr.notify["focused-workspace"].connect(() => {
var focused = hypr.focused_workspace == ws;
if (focused) {
Astal.widget_set_class_names(btn, {"focused"});
} else {
Astal.widget_set_class_names(btn, {});
}
});
btn.clicked.connect(ws.focus);
return btn;
}
}
class FocusedClient : Gtk.Box {
public FocusedClient() {
Astal.widget_set_class_names(this, {"Focused"});
AstalHyprland.get_default().notify["focused-client"].connect(sync);
sync();
}
void sync() {
foreach (var child in get_children())
child.destroy();
var client = AstalHyprland.get_default().focused_client;
if (client == null)
return;
var label = new Gtk.Label(client.title) { visible = true };
client.bind_property("title", label, "label", BindingFlags.SYNC_CREATE);
add(label);
}
}
class Media : Gtk.Box {
AstalMpris.Mpris mpris = AstalMpris.get_default();
public Media() {
Astal.widget_set_class_names(this, {"Media"});
mpris.notify["players"].connect(sync);
sync();
}
void sync() {
foreach (var child in get_children())
child.destroy();
if (mpris.players.length() == 0) {
add(new Gtk.Label("Nothing Playing"));
return;
}
var player = mpris.players.nth_data(0);
var label = new Gtk.Label(null);
var cover = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0) {
valign = Gtk.Align.CENTER
};
Astal.widget_set_class_names(cover, {"Cover"});
player.bind_property("metadata", label, "label", BindingFlags.SYNC_CREATE, (_, src, ref trgt) => {
var title = player.title;
var artist = player.artist;
trgt.set_string(@"$artist - $title");
return true;
});
var id = player.notify["cover-art"].connect(() => {
var art = player.cover_art;
Astal.widget_set_css(cover, @"background-image: url('$art')");
});
cover.destroy.connect(() => player.disconnect(id));
add(cover);
add(label);
}
}
class SysTray : Gtk.Box {
HashTable<string, Gtk.Widget> items = new HashTable<string, Gtk.Widget>(str_hash, str_equal);
AstalTray.Tray tray = AstalTray.get_default();
public SysTray() {
Astal.widget_set_class_names(this, { "SysTray" });
tray.item_added.connect(add_item);
tray.item_removed.connect(remove_item);
}
void add_item(string id) {
if (items.contains(id))
return;
var item = tray.get_item(id);
var btn = new Gtk.MenuButton() { use_popover = false, visible = true };
var icon = new Astal.Icon() { visible = true };
item.bind_property("tooltip-markup", btn, "tooltip-markup", BindingFlags.SYNC_CREATE);
item.bind_property("gicon", icon, "gicon", BindingFlags.SYNC_CREATE);
item.bind_property("menu-model", btn, "menu-model", BindingFlags.SYNC_CREATE);
btn.insert_action_group("dbusmenu", item.action_group);
item.notify["action-group"].connect(() => {
btn.insert_action_group("dbusmenu", item.action_group);
});
btn.add(icon);
add(btn);
items.set(id, btn);
}
void remove_item(string id) {
if (items.contains(id)) {
items.remove(id);
}
}
}
class Wifi : Astal.Icon {
public Wifi() {
Astal.widget_set_class_names(this, {"Wifi"});
var wifi = AstalNetwork.get_default().wifi;
// var wifi = AstalNetwork.get_default().get_wifi();
if (wifi != null) {
wifi.bind_property("ssid", this, "tooltip-text", BindingFlags.SYNC_CREATE);
wifi.bind_property("icon-name", this, "icon", BindingFlags.SYNC_CREATE);
}
}
}
class AudioSlider : Gtk.Box {
Astal.Icon icon = new Astal.Icon();
Astal.Slider slider = new Astal.Slider() { hexpand = true };
public AudioSlider() {
add(icon);
add(slider);
Astal.widget_set_class_names(this, {"AudioSlider"});
Astal.widget_set_css(this, "min-width: 140px");
var speaker = AstalWp.get_default().audio.default_speaker;
speaker.bind_property("volume-icon", icon, "icon", BindingFlags.SYNC_CREATE);
speaker.bind_property("volume", slider, "value", BindingFlags.SYNC_CREATE);
slider.dragged.connect(() => speaker.volume = slider.value);
}
}
class Battery : Gtk.Box {
Astal.Icon icon = new Astal.Icon();
Astal.Label label = new Astal.Label();
public Battery() {
add(icon);
add(label);
Astal.widget_set_class_names(this, {"Battery"});
var bat = AstalBattery.get_default();
bat.bind_property("is-present", this, "visible", BindingFlags.SYNC_CREATE);
bat.bind_property("battery-icon-name", icon, "icon", BindingFlags.SYNC_CREATE);
bat.bind_property("percentage", label, "label", BindingFlags.SYNC_CREATE, (_, src, ref trgt) => {
var p = Math.floor(src.get_double() * 100);
trgt.set_string(@"$p%");
return true;
});
}
}
class Time : Astal.Label {
string format;
AstalIO.Time interval;
void sync() {
label = new DateTime.now_local().format(format);
}
public Time(string format = "%H:%M - %A %e.") {
this.format = format;
interval = AstalIO.Time.interval(1000, null);
interval.now.connect(sync);
destroy.connect(interval.cancel);
Astal.widget_set_class_names(this, {"Time"});
}
}
class Left : Gtk.Box {
public Left() {
Object(hexpand: true, halign: Gtk.Align.START);
add(new Workspaces());
add(new FocusedClient());
}
}
class Center : Gtk.Box {
public Center() {
add(new Media());
}
}
class Right : Gtk.Box {
public Right() {
Object(hexpand: true, halign: Gtk.Align.END);
add(new SysTray());
add(new Wifi());
add(new AudioSlider());
add(new Battery());
add(new Time());
}
}
class Bar : Astal.Window {
public Bar(Gdk.Monitor monitor) {
Object(
anchor: Astal.WindowAnchor.TOP
| Astal.WindowAnchor.LEFT
| Astal.WindowAnchor.RIGHT,
exclusivity: Astal.Exclusivity.EXCLUSIVE,
gdkmonitor: monitor
);
Astal.widget_set_class_names(this, {"Bar"});
add(new Astal.CenterBox() {
start_widget = new Left(),
center_widget = new Center(),
end_widget = new Right(),
});
show_all();
}
}

17
overlays/default.nix Normal file
View file

@ -0,0 +1,17 @@
[
(self: super: {
angry-oxide = import ../packages/angryoxide {
pkgs = super;
inherit
(super)
lib
;
};
ekphos = import ../packages/ekphos {
pkgs = super;
};
x86-manpages = import ../packages/x86-manpages {
pkgs = super;
};
})
]

View file

@ -0,0 +1,25 @@
{pkgs, ...}: let
inherit
(pkgs)
lib
;
in
pkgs.rustPackages.rustPlatform.buildRustPackage {
pname = "ekphos";
version = "v0.20.10";
src = pkgs.fetchFromGitHub {
repo = "ekphos";
owner = "hanebox";
sha256 = "sha256-mZ6yQdPpJ9PglYyHwivVDO05vRPvwZG7DPEBJeOVlFE=";
rev = "1ac1ab68dd4ea867dadf54f60e32a9a3e0305695";
};
cargoHash = "sha256-s6Elg0Fqxdlc2/428oV7POMqphx8vWaLOncO5kZyBfQ=";
meta = {
description = "A lightweight, fast, terminal-based markdown research tool inspired by Obsidian";
homepage = "https://github.com/hanebox/ekphos";
license = lib.licenses.mit;
maintainers = [lib.maintainers.emileclarkb];
};
}

View file

@ -0,0 +1,35 @@
# Template: https://nixos-and-flakes.thiscute.world/development/intro
{
description = "Humanity's Last Exam - Devshell";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
};
outputs = {nixpkgs, ...}: let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
};
python = pkgs.python312.override {
self = python;
packageOverrides = pyfinal: pyprev: {
huggingface-hub = pyfinal.callPackage ./huggingface_hub.nix {};
hf-xet = pyfinal.callPackage ./hf-xet.nix {};
};
};
in {
devShells."${system}".default = pkgs.mkShell {
packages = [
(python.withPackages (pypkgs: [
pypkgs.huggingface-hub
]))
];
shell = "${pkgs.bash}/bin/bash";
shellHook = ''
alias hf=huggingface-cli
'';
};
};
}

View file

@ -0,0 +1,56 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
pkg-config,
rustPlatform,
openssl,
}:
buildPythonPackage rec {
pname = "hf-xet";
version = "1.1.5";
pyproject = true;
src = fetchFromGitHub {
owner = "huggingface";
repo = "xet-core";
tag = "v${version}";
hash = "sha256-udjZcXTH+Mc4Gvj6bSPv1xi4MyXrLeCYav+7CzKWyhY=";
};
sourceRoot = "${src.name}/hf_xet";
cargoDeps = rustPlatform.fetchCargoVendor {
inherit
pname
version
src
sourceRoot
;
hash = "sha256-PTzYubJHFvhq6T3314R4aqBAJlwehOqF7SbpLu4Jo6E=";
};
nativeBuildInputs = [
pkg-config
rustPlatform.cargoSetupHook
rustPlatform.maturinBuildHook
];
buildInputs = [
openssl
];
env.OPENSSL_NO_VENDOR = 1;
pythonImportsCheck = ["hf_xet"];
# No tests (yet?)
doCheck = false;
meta = {
description = "Xet client tech, used in huggingface_hub";
homepage = "https://github.com/huggingface/xet-core/tree/main/hf_xet";
changelog = "https://github.com/huggingface/xet-core/releases/tag/v${version}";
license = lib.licenses.asl20;
};
}

View file

@ -0,0 +1,62 @@
/*
* WARNING: Just use `pkgs.python312Packages.huggingface-hub` (or change python version)
* WARNING: I didn't realise it existed when I packaged this.
*
* Nix Resources:
* 1. https://wiki.nixos.org/wiki/Python
* 2. https://nixos.org/manual/nixpkgs/unstable/#developing-with-python
*
* Hugging Face Resources:
* 1. https://github.com/huggingface/huggingface_hub
* 2. https://huggingface.co/docs/huggingface_hub/main/en/guides/cli
*/
{
lib,
buildPythonPackage,
fetchPypi,
# build time dependencies
setuptools,
# runtime dependencies
filelock,
fsspec,
hf-xet,
pyyaml,
requests,
tqdm,
typing-extensions,
}:
buildPythonPackage rec {
pname = "huggingface_hub";
version = "0.34.3";
src = fetchPypi {
inherit pname version;
hash = "sha256-1YEw/VqnQISAaBR1SRwKvX6DVEIIL7w+9NRbbDn4OFM=";
};
pyproject = true;
doCheck = false; # skip unit testing
pythonImportsCheck = ["huggingface_hub"];
# buildtime dependencies
build-system = [
setuptools
];
# runtime dependencies
dependencies = [
filelock
fsspec
hf-xet
pyyaml
requests
tqdm
typing-extensions
];
meta = rec {
description = "The official Python client for the Huggingface Hub.";
homepage = "https://github.com/huggingface/huggingface_hub";
changelog = "${homepage}/releases/tag/v${version}";
license = lib.licenses.asl20; # Apache License 2.0
};
}

View file

@ -0,0 +1,32 @@
{pkgs, ...}:
pkgs.stdenv.mkDerivation {
pname = "x86-manpages";
version = "0.0.1";
src = pkgs.fetchFromGitHub {
owner = "ttmo-O";
repo = "x86-manpages";
## Recommended
# rev = "0e199a8b4d90be7eb715291c21cf41de8527beac";
# sha256 = "0im596j0pf90npg933gkq6wpw23c47fcwv0n64qfqn5mcy92qbcb";
rev = "94902f9c45de0efe803c32b6c3e88d6623881866";
sha256 = "0k6nsfabzqwnhjiyw2kyg0z49nzrsxn515f6dcjh1rn7bzih5562";
};
installPhase = ''
mkdir -p $out/man/man7
shopt -u nullglob
for m in man7/*.7; do
install -m 644 "$m" "$out/man/man7"
done
'';
meta = with pkgs.lib; {
description = "Manpages for x86 instructions";
homepage = "https://github.com/ttmo-O/x86-manpages";
license = licenses.mit;
platforms = platforms.all;
};
}

44
scripts/box Executable file
View file

@ -0,0 +1,44 @@
#!/usr/bin/env bash
USAGE="Usage: box [--enter]"
# ===== Configuration ===== #
DATA_DIR="$HOME/.data/box"
# ========================= #
function setup {
mkdir -p "$DATA_DIR" &>/dev/null
}
function box {
mktemp -d
# TODO: use a custom name instead
}
set -euo pipefail
ENTER=false
for arg in $@; do
case "$arg" in
-e|--enter)
ENTER=true
shift
;;
-h|--help)
echo "$USAGE"
;;
-*)
echo "[!] Unknown opt \"$arg\"" >&2
;;
*)
echo "[!] Unknown arg \"$arg\"" >&2
;;
esac
done
setup
BOX=$(box)
if [[ "$ENTER" == true ]]; then
cd "$BOX"
fi

7
scripts/lsyscalls Executable file
View file

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# USAGE: lsyscalls | sort [-nk2]
echo -e '#include <sys/syscall.h>'\
| cpp -dM \
| grep "#define __NR_.*[0-9]$" \
| cut -d_ -f 4-