Compare commits

..

No commits in common. "myputer" and "main" have entirely different histories.

134 changed files with 5920 additions and 2661 deletions

1
.gitignore vendored Executable file → Normal file
View file

@ -2,3 +2,4 @@ ISSUES/
secrets/
result
rebuild*.log

7
.sops.yaml Normal file
View file

@ -0,0 +1,7 @@
keys:
- &cry age1e5e32alqa20cf40wt9jq8aaa2x3gh32207xj6ea5veszlpxnzgjqd2htm7
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *cry

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,3 +0,0 @@
- [ ] Stop colmena adding inputs for unmanaged nodes
- [ ] Use latest commit for colmena
- [ ] Program colmena to have an option that adds `--no-check-sigs` to `nix copy`

View file

@ -1,8 +0,0 @@
Godlike
https://github.com/end-4/dots-hyprland
Gorgeous
https://github.com/prasanthrangan/hyprdots
Very nice
https://github.com/linuxmobile/hyprland-dots

77
README.md Executable file → Normal file
View file

@ -1,51 +1,15 @@
## My NixOS Flake
>[!TIP]
> My flake is written using [my Cerulean project](https://github.com/cry128/cerulean). Hopefully
> it can serve as a decent example of my vision with the Cerulean + Snowflake projects.
### Philosophy
I try to use Home Manager as little as possible. When I first started with NixOS I found
it distracting and confusing. NixOS already handles system wide and user packages, so having
another user level package management method was baffling. Obviously I understand now how
it can be useful (so I do use it). But where possible I will instead use the functionality
of Nix rather than Home Manager.
>[!TODO]
> My philosophy has kinda changed since the beginning
###### Structuring Modules
Modules are organised into groups (ie "Core"), from here a module is structured as either:
1. a single `.nix` file (ie bluetooth.nix). I do this when I won't implement an alternative
2. a directory (ie `sound`) containing a set of alternative implementations and a `default.nix`
that simply imports one of the implementations. For the `sound` example I currently have it structured
to default to `pipewire.nix`. I haven't made alternatives yet but the idea is that it is HIGHLY likely
I do in future.
### TODO
There are a lot of `TODO` items in this repository. To improve these dotfiles
I should run a command to find files containing "TODO" and then implement the
recommendation I left behind :)
##### Small Explanation of Fonts
There are four types of fonts (to my knowledge at least):
1. serif (funny squigles / small elegant strokes included)
2. sans-serif (meaning "without serifs")
3. monospace (all glyphs are of a uniform size)
4. emoji (cute lil faces)
Fun fact: on Android, the emojis you are seeing are part of the noto-emoji font :)
For finding a font for programming I highly recommend trying https://www.codingfont.com/
### My config
Font:
Iosevka nerd font set as default/prefered font
Terminal uses IosevkaTerm nerd font
Home-Manager:
I just to use home-manager standalone and not as a NixOS module, thus allowing
my dotfiles to also work on non-NixOS systems.
### Explaining my Vision with r/unixporn posts
### Links
#### Inspiration
##### Explaining my Vision with r/unixporn posts
I want the side panel from https://www.reddit.com/r/unixporn/comments/12wpvyf/hyprland_eww_is_all_i_need/
but not the colour scheme and I'm 50/50 on the bar being on th eleft side lol. Also I love the volume bar on the right!
@ -64,22 +28,29 @@ Their window decorations and bar are great, also being able to hide everything u
https://www.reddit.com/r/unixporn/comments/vkcasz/i3gaps_i_prefer_light_mode/
If their colour scheme was a little less white I'd love it but overall one of my favourites every
##### Other Inspiring Shtuff
1. https://github.com/sabrehagen/desktop-environment
### Wallpaper Sources
#### Wallpaper Sources
1. https://www.wallpaperflare.com/
2. https://alphacoders.com
especially this one person: https://alphacoders.com/users/profile/69089/robokoboto
and also the lofi category: https://alphacoders.com/lofi
#### Teach Yourself Nix
1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles)
Really good security oriented NixOS stuff
2. https://jade.fyi/blog/flakes-arent-real/
Interesting blog post on using flakes
### Credits
#### Credits
1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles
The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured.
The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured.
2. https://github.com/Misterio77/nix-starter-configs
Really great starter config for learning how parts interact and how to generally structure flakes
Really great starter config for learning how parts interact and how to generally structure flakes
3. https://nixos.wiki/wiki/Fonts
Wiki page explaining how to install fonts and nerd fonts on NixOS
Wiki page explaining how to install fonts and nerd fonts on NixOS
4. https://github.com/adi1090x/rofi
For the Rofi theme
For the Rofi theme
5. https://github.com/zDyanTB/HyprNova
For the really cool hyprlock theme
For the really cool hyprlock theme

91
TODO
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
};
```

9
TODO.md Normal file
View file

@ -0,0 +1,9 @@
- [ ] Update the README.md
- [ ] switch ssh keys to ECC (fuck RSA)
- [ ] forgejo not post-quantum (fix that)
- [X] migrate forge.dobutterfliescry.net -> tearforge.net
- [X] rename forgejo user to git
- [ ] setup my own VPN
- [ ] connect matcha to my VPN
- [ ] use matcha to build stuff instead of using my laptop

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

20
colors.rasi Normal file
View file

@ -0,0 +1,20 @@
* {
background: rgba(51,37,65,0.9);
foreground: rgba(198,186,227,0.9);
color00: rgba(78,66,70,0.9);
color01: rgba(111,91,159,0.9);
color02: rgba(120,98,164,0.9);
color03: rgba(131,128,181,0.9);
color04: rgba(154,127,183,0.9);
color05: rgba(157,129,185,0.9);
color06: rgba(123,153,183,0.9);
color07: rgba(165,148,207,0.9);
color08: rgba(115,103,145,0.9);
color09: rgba(129,102,193,0.9);
color10: rgba(140,112,199,0.9);
color11: rgba(145,141,218,0.9);
color12: rgba(170,126,217,0.9);
color13: rgba(174,130,220,0.9);
color14: rgba(135,181,228,0.9);
color15: rgba(165,148,207,0.9);
}

58
deploy
View file

@ -1,58 +0,0 @@
#!/usr/bin/env bash
set -e
usage="Usage: $(basename $0) [OPTIONS]
Options:
-f, --fresh Remove old content in the nixstore (good for debugging)
-b, --bootloader Reinstall the bootloader
-h, --help Show this message (^_^)"
# delete all cached entries
# to make the system from scratch
collect_garbage () {
sudo nix-collect-garbage --delete-old
}
rebuild_flake () {
# make sure all changes are visible to nixos
git add . --verbose
if [ "$1" = "reinstall-bootloader" ]; then
sudo nixos-rebuild switch --flake . --install-bootloader
else
sudo nixos-rebuild switch --flake .
#nixos-rebuild build --flake .# --cores 8 -j 1
fi
}
# check which flags were given
flag_fresh=false
flag_bootloader=false
for flag in "$@"; do
case "$flag" in
-f|--fresh)
flag_fresh=true ;;
-b|--bootloader)
flag_bootloader=true ;;
-h|--help)
echo "$usage"
exit 0 ;;
*)
echo "[!] Unknown flag \"$flag\""
exit 1 ;;
esac
done
# delete cached items in nixstore
if [ "$flag_fresh" = true ]; then
collect_garbage
exit 0
fi
# nixos-rebuild switch ...
if [ "$flag_bootloader" = true ]; then
collect_garbage
rebuild_flake "reinstall-bootloader"
else
rebuild_flake
fi

View file

@ -1,13 +0,0 @@
#!/usr/bin/env bash
set -e # terminate if any command fails
echo "[+] Adding keys to ssh-agent"
ssh-add ~/.ssh/id_hyrule
printf "\n"
git add .
# Deploy to all Colmena hives
colmena build --experimental-flake-eval
colmena apply --experimental-flake-eval
# colmena apply --on hyrule --experimental-flake-eval

940
flake.lock generated Executable file → Normal file

File diff suppressed because it is too large Load diff

189
flake.nix Executable file → Normal file
View file

@ -1,147 +1,82 @@
{
description = "Emile's Nix Dotfiles";
description = "im gonna cry again ;-;";
inputs = {
# nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
#nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
systems.url = "github:nix-systems/default-linux";
#home-manager = {
# url = "github:nix-community/home-manager";
# inputs.nixpkgs.follows = "nixpkgs";
#};
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
spicetify-nix = {
url = "github:Gerg-L/spicetify-nix";
home-manager = {
url = "github:nix-community/home-manager/release-25.11";
inputs.nixpkgs.follows = "nixpkgs";
};
nixcord.url = "github:kaylorben/nixcord";
nt.url = "git+https://tearforge.net/cry/nt";
grub2-themes.url = "github:vinceliuice/grub2-themes";
# is this necessary? (aren't I enabling it in `configuration.nix` anyways?)
hyprland.url = "github:hyprwm/Hyprland";
swww.url = "github:LGFae/swww";
# TODO: declarative flatpak management
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.4.1";
ags.url = "github:Aylur/ags";
hyprpanel.url = "github:Jas-SinghFSU/HyprPanel";
# colmena.url = "github:zhaofengli/colmena";
colmena.url = "github:zhaofengli/colmena/?rev=47b6414d800c8471e98ca072bc0835345741a56a";
# alternative to colmena (currently in testing)
#deploy-rs.url = "github:serokell/deploy-rs";
#wishlist.url = "path:/home/me/nixdots/flakes/wishlist";
};
outputs = {
self,
nixpkgs,
#home-manager,
hyprland,
grub2-themes,
nixcord,
colmena,
#deploy-rs,
...
} @ inputs: let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
config = {
allowUnfree = true;
cerulean = {
# url = "git+https://tearforge.net/cry/cerulean";
url = "/home/me/cry/mk/cerulean";
inputs = {
nt.follows = "nt";
systems.follows = "systems";
nixpkgs.follows = "nixpkgs";
};
};
# TODO: come back to this its really cool
# this is just something I'm experimenting with
PROJECT_ROOT = builtins.toString ./.;
in {
# `nix develop` shell
devShells."x86_64-linux".default = pkgs.mkShell {
buildInputs = [
#colmena-new
];
};
nixosConfigurations = {
# i be on my puter fr
myputer = nixpkgs.lib.nixosSystem {
# nix passes these to every single module
specialArgs = {inherit inputs pkgs;};
modules = [
./hosts/myputer
grub2-themes.nixosModules.default
];
};
# my laptop 0w0
lolcathost = nixpkgs.lib.nixosSystem {
specialArgs = {inherit inputs pkgs;};
modules = [
./hosts/lolcathost
grub2-themes.nixosModules.default
];
};
# meine vps
# hyrule = nixpkgs.lib.nixosSystem {
# # manually set system architecture since
# # this is for a remote deployment
# system = "x86_64-linux";
# specialargs = {inherit inputs pkgs;};
#
# modules = [
# ./hosts/hyrule
# ];
# };
};
# remote deployment with deploy-rs
# deploy.nodes.hyrule = {
# hostname = "imbored.dev";
# # create a primary profile called "system"
# profiles.system = {
# user = "root"; # user to deploy to
# path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.hyrule;
#
# # ssh configuration for reaching the server
# sshUser = "ae";
# #interactiveSudo = true; # TODO: use this and revoke passwordless sudo for ae
# sshOpts = ["-i" "/home/me/.ssh/id_hyrule"];
# remoteBuild = false; # build locally then deploy to remote host
# };
# };
# remote deployment to my servers!!
colmenaHive = colmena.lib.makeHive {
meta = {
# set nixpkgs global
nixpkgs = pkgs;
# set nixpkgs per server
nodeNixpkgs = {
hyrule = import nixpkgs {
system = "x86_64-linux";
config.allowUnfree = false;
dobutterfliescry-net = {
url = "git+https://tearforge.net/cry/site";
inputs = {
nixpkgs.follows = "nixpkgs";
nixpkgs-unstable.follows = "nixpkgs-unstable";
systems.follows = "systems";
};
};
# we can use `specialArgs.inputs` to inject wishlist into hyrule's module
#specialArgs.inputs = with inputs; {inherit wishlist;};
hyprland = {
url = "github:hyprwm/Hyprland";
inputs = {
# nixpkgs.follows = "nixpkgs";
# systems.follows = "systems";
};
};
# meine vps
hyrule = import ./hosts/hyrule;
awww = {
url = "git+https://codeberg.org/LGFae/awww";
inputs.nixpkgs.follows = "nixpkgs";
};
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
nixcord = {
url = "github:FlameFlag/nixcord";
inputs.nixpkgs.follows = "nixpkgs";
};
nixcats.url = "github:BirdeeHub/nixCats-nvim";
grub2-themes = {
url = "github:vinceliuice/grub2-themes";
inputs.nixpkgs.follows = "nixpkgs";
};
sddm-silent = {
url = "github:uiriansan/SilentSDDM";
inputs.nixpkgs.follows = "nixpkgs";
};
mango = {
url = "github:DreamMaoMao/mango";
inputs.nixpkgs.follows = "nixpkgs";
};
};
nixConfig = {
extra-experimental-features = "pipe-operators";
};
outputs = inputs: let
inherit (inputs.cerulean) snow;
in
snow.flake inputs ./.;
}

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";
};
}
);
*/
}

67
groups/all/default.nix Normal file
View file

@ -0,0 +1,67 @@
{
pkgs,
lib,
...
}: {
imports = [
./modules/flatpak.nix
];
# NOTE: mkDefault is 1000 and mkForce is 50
# NOTE: so this is like a second mkDefault
security.sudo.wheelNeedsPassword = true;
networking = {
networkmanager.enable = true;
nftables.enable = true;
firewall = {
enable = lib.mkDefault true;
allowPing = lib.mkDefault true;
};
# Use CloudFlare's WARP+ 1.1.1.1 DNS service
nameservers = [
"1.1.1.1"
"1.0.0.1"
];
};
programs.nh = {
enable = true;
clean.enable = true;
clean.extraArgs = "--keep-since 7d --keep 3";
# TODO: move nh config to be home-manager
flake = "/home/me/flake"; # sets NH_OS_FLAKE variable for you
};
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 = lib.mkDefault "en_US.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "us";
};
users.defaultUserShell = pkgs.bash;
environment.systemPackages = with pkgs; [
git
vim
wget
tree
];
}

View file

@ -0,0 +1,12 @@
{...}: {
services.flatpak = {
# DEBUG: remotes = [
# DEBUG: {
# DEBUG: location = "https://dl.flathub.org/repo/flathub.flatpakrepo";
# DEBUG: name = "flathub";
# DEBUG: }
# DEBUG: ];
# DEBUG: uninstallUnmanaged = true;
};
}

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

@ -0,0 +1,121 @@
{
inputs,
pkgs,
config,
...
}: {
imports = [
./programs.nix
../../hosts/modules/bashistrans.nix
../../hosts/modules/wm/hyprland.nix
../../hosts/modules/steam.nix
../../hosts/modules/obsidian.nix
];
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 = ! config.services.xserver.enable; # experimental
# theme = "corners";
};
# defaultSession = "mango"; # DEBUG
defaultSession =
if config.programs.hyprland.withUWSM == true
then "hyprland-uwsm"
else "hyprland";
};
tumbler.enable = true; # Thunar image thumbnail support
gvfs.enable = true; # Thunar mount, trash, and other functionality
};
home-manager.sharedModules = [
inputs.mango.hmModules.mango
];
programs = {
zsh.enable = true;
fish.enable = true;
nix-ld.enable = true;
mango.enable = true;
# 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; [
# sddm-theme-corners
# ];
};
# ------- USERS -------
users = {
users = {
# literally me fr (personal account)
me = {
isNormalUser = true;
extraGroups = ["wheel" "netdev" "docker"];
shell = pkgs.bash;
packages = with pkgs; [
firefox
gitkraken
];
};
};
};
}

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

@ -0,0 +1,33 @@
{
pkgs,
upkgs,
...
}: {
# ---- SYSTEM PACKAGES -----
environment.systemPackages = with pkgs; [
# User Environment
awww # 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
element-desktop
vlc
# Games
prismlauncher # minecraft
upkgs.olympus # celeste
discord
discordo
upkgs.ekphos
];
}

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

@ -0,0 +1,120 @@
{lib, ...}: {
imports = [
./programs.nix
];
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
generateCaches = false;
};
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;
};
};
}

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

@ -0,0 +1,124 @@
{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
# 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
wormhole-rs
# Pretty necessary
git
git-filter-repo
brightnessctl
acpi
# upower
vim
powertop
imagemagick
usbutils
# "Standard" Unix Commands
file
wget
tree
pstree
zip
unzip
unrar-free
lz4
man-pages
man-pages-posix
# Cryptography
gnupg
openssl
libargon2
];
services.pcscd.enable = true;
programs = {
gnupg.agent = {
enable = true;
# pinentryPackage = pkgs.pinentry-curses;
enableSSHSupport = true;
};
};
}

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

@ -0,0 +1,85 @@
{
pkgs,
lib,
...
}: {
networking = {
firewall = {
allowedTCPPorts = [
42069 # ssh
];
};
nftables.enable = true;
};
security = {
# accept Lets Encrypt's security policy
acme = {
acceptTerms = true;
defaults.email = "eclarkboman@gmail.com";
};
sudo = {
enable = true;
wheelNeedsPassword = true;
};
# allow SSH keys for passwordless auth
pam = {
sshAgentAuth.enable = true;
services.sudo.sshAgentAuth = true; # pam_ssh_agent_auth module
};
};
services = {
openssh = {
enable = true;
ports = [42069];
settings = {
PasswordAuthentication = false;
PermitRootLogin = "no";
AllowUsers = ["cry"]; # DO NOT ALLOW ALL
UseDns = true;
X11Forwarding = false;
};
};
};
# simple fail2ban config (not production ready or anything though)
# refer to: https://nixos.wiki/wiki/Fail2Ban
services.fail2ban = {
enable = true;
ignoreIP = ["192.168.0.0/16"];
maxretry = 5;
bantime = "10m"; # 10 minute ban
bantime-increment = {
enable = true;
formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
# multipliers = "1 2 4 8 16 32 64";
maxtime = "168h"; # dont ban for more than 1 week
overalljails = true;
};
};
users = {
users = {
# primary user
cry = {
isNormalUser = true;
createHome = true;
home = "/home/cry";
extraGroups = ["wheel"];
openssh.authorizedKeys.keys = lib.mkDefault [
(throw ''
You goofy goober :3
Hosts in the `server` group must set `users.users.cry.openssh.authorizedKeys.keys = [ ... ]`.
'')
];
};
};
};
environment.systemPackages = with pkgs; [
unixtools.netstat
];
}

View file

@ -1,56 +0,0 @@
{
inputs,
outputs,
lib,
config,
pkgs,
...
}: {
nixpkgs = {
config.allowUnfree = false;
};
imports = [
];
home = {
username = "ae";
homeDirectory = "/home/ae";
};
programs = {
};
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";
# ssh = {
# enable = true;
# forwardAgent = true;
# addKeysToAgent = "yes";
# matchBlocks = {
# hyrule = {
# hostname = "imbored.dev";
# user = "ae";
# port = 22;
# identityFile = "/home/ae/.ssh/id_hyrule";
# };
# };
# };
# 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
}

21
homes/cry/default.nix Normal file
View file

@ -0,0 +1,21 @@
{...}: {
nixpkgs = {
config.allowUnfree = false;
};
imports = [
../modules/fish.nix
../modules/bat.nix
../modules/btop.nix
];
home = {
username = "cry";
homeDirectory = "/home/cry";
};
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";
home.stateVersion = "24.11"; # DO NOT MODIFY
}

View file

@ -1,53 +1,53 @@
{
inputs,
outputs,
lib,
config,
pkgs,
...
}: {
nixpkgs = {
config.allowUnfree = true;
};
imports = [
../modules/fish.nix
../modules/btop.nix
../modules/tmux.nix
../modules/git.nix
../modules/bat.nix
../modules/fish.nix
../modules/term/foot.nix
../modules/editor/helix.nix
../modules/editor/neovim
../modules/btop.nix
../modules/rio.nix
../modules/firefox.nix
../modules/nixcord.nix
../modules/apps/firefox.nix
../modules/apps/thunderbird.nix
../modules/apps/nixcord.nix
#../modules/hypr/hypridle.nix
#../modules/hypr/hyprlock.nix
# ../modules/wm
../modules/wm/mangowc.nix
# ../modules/wm/hypr/hyprland.nix
# ../modules/wm/hypr/hyprlock.nix
../modules/kanshi.nix
../modules/ags
../modules/mako.nix
];
/*
programs.spicetify =
let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
in
{
enable = true;
enabledExtensions = with spicePkgs.extensions; [
adblock
hidePodcasts
shuffle # shuffle+ (special characters are sanitized out of extension names)
nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (lib.GetName pkg) [
"vscode-extension-ms-dotnettools-csharp"
];
theme = spicePkgs.themes.catppuccin;
colorScheme = "mocha";
};
*/
home = {
username = "me";
homeDirectory = "/home/me";
shellAliases = {
# rebuild = "sudo nixos-rebuild switch --flake /home/me/flake --show-trace";
# trybuild = "sudo nixos-rebuild test --flake /home/me/flake --show-trace";
rebuild = "nh os switch ~/flake --show-trace";
trybuild = "nh os test ~/flake --show-trace";
brip = "batgrep"; # bat + ripgrep
man = "batman"; # bat + man
};
sessionVariables = {
NIX_SHELL_PRESERVE_PROMPT = 1;
};
pointerCursor = {
gtk.enable = true;
# x11.enable = true # dont enable since im on hyprland
@ -55,6 +55,18 @@
name = "Bibata-Modern-Ice";
size = 16;
};
packages = with pkgs; [
# for services.gnome-keyring
pkgs.gcr # provides org.gnome.keyring.SystemPrompter
seahorse # gui
tor-browser
fuzzel
speedtest-cli
];
};
gtk = {
@ -71,15 +83,12 @@
# TODO: use a variable to mirror this cursor size
# with the `home.pointerCurser.size`
cursorTheme = {
# dont set the theme (use system default instead)
# only set size to match the system
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = 16;
};
};
# TODO: this lowkey doesnt work... (maybe the name "Dracula" is wrong?)
qt = {
enable = true;
platformTheme.name = "gtk2";
@ -90,78 +99,76 @@
# these are both required for home-manager to work
home-manager.enable = true;
# DEBUG: testing if my xdg-desktop-portal-hyprland is working or not
obs-studio = {
zsh = {
enable = true;
plugins = with pkgs.obs-studio-plugins; [
wlrobs
obs-backgroundremoval
obs-pipewire-audio-capture
enableCompletion = true;
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
history = {
size = 10000;
ignoreAllDups = true;
path = "$HOME/.zsh_history";
ignorePatterns = [
"rm *"
];
};
};
# set ssh profiles
# (all we need is hyrule, everything else is through wishlist)
# NOTE: (IMPORTANT) this DOES NOT start the ssh-agent
# for that you need to use `services.ssh-agent.enable`
# WARNING: this DOES NOT start the ssh-agent
# WARNING: for that you need to use `services.ssh-agent.enable`
ssh = {
enable = true;
forwardAgent = true;
addKeysToAgent = "yes"; # always add keys to ssh-agent
forwardAgent = false;
addKeysToAgent = "yes";
matchBlocks = {
butterfly = {
hostname = "dobutterfliescry.net";
user = "cry";
port = 42069;
identityFile = "~/keys/butterfly";
setEnv = {
TERM = "xterm-256color";
};
};
hyrule = {
hostname = "imbored.dev";
user = "ae";
hostname = "hyrule.dobutterfliescry.net";
user = "cry";
port = 42069;
identityFile = "~/keys/hyrule";
setEnv = {
TERM = "xterm-256color";
};
};
matcha = {
hostname = "192.168.88.250";
user = "emile";
port = 22;
identityFile = "~/.ssh/id_hyrule";
identityFile = "~/keys/matcha";
};
subspace = {
hostname = "imbored.dev";
user = "subspace";
youcue = {
hostname = "moss.labs.eait.uq.edu.au";
user = "s4740056";
port = 22;
identityFile = "~/.ssh/id_subspace";
identityFile = "~/keys/other/youcue";
setEnv = {
TERM = "xterm-256color";
};
};
};
};
};
# 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 it will just exec fish
#bash = {
# 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
# '';
#};
/*
spicetify =
let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
in
{
enable = true;
enabledExtensions = with spicePkgs.extensions; [
adblock
hidePodcasts
#shuffle
];
theme = spicePkgs.themes.catppuccin;
colorScheme = "mocha";
};
*/
};
services = {
# enable OpenSSH private key agent
services.ssh-agent.enable = true;
# the ssh-agent won't set this for itself...
systemd.user.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent";
#home.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent";
# ssh-agent.enable = true;
gnome-keyring.enable = true;
};
# the ssh-agent won't set this for itself...
# systemd.user.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent";
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";

View file

@ -1,24 +1,28 @@
import { AppLauncher } from "./widgets/applauncher.js"
import { Notifications } from "./widgets/notifications.js"
//import { Notifications } from "./widgets/notifications.js"
/*
const date = Variable('', {
poll: [1000, 'date'],
})
*/
/*
const Bar = (monitor = 0) => Widget.Window({
monitor,
name: 'bar${monitor}',
anchor: ['top', 'left', 'right'],
child: Widget.Label({ label: date.bind() }),
})
*/
App.config({
style: "./style.css",
// icons: "./assets",
windows: [
Bar(),
//Bar(),
AppLauncher,
Notifications()
//Notifications()
]
// gtkTheme: "Adwaita-dark",
// cursorTheme: "Qogir",

View file

@ -2,10 +2,10 @@ const WINDOW_NAME = "fullscreen";
const Fullscreen = (children) => Widget.Box({
vertical: true,
css: "background-image: url('https://images2.alphacoders.com/135/1351579.png');"
+ "background-size: cover;"
+ "background-position: center;"
+ "background-repeat: no-repeat;",
css: "background-image: url('~/downloads/wallpaper/kill-my-firstborn/astronaut-pink-blue.png');",
//+ "background-size: cover;"
//+ "background-position: center;"
//+ "background-repeat: no-repeat;",
children: children,
})

View file

@ -0,0 +1,250 @@
{inputs, ...}: {
imports = [
inputs.nixcord.homeModules.nixcord
];
programs.nixcord = {
enable = true;
equibop.enable = true;
discord = {
vencord.enable = false;
equicord.enable = true;
};
config = {
enabledThemes = [
"aurorastheme.css"
"base16-colors.css"
];
plugins = {
anonymiseFileNames = {
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 = true;
};
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"
# "1468324280445046824"
# ];
# }
# {
# 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"
# "1461929299727749145"
# "1470963392121536657"
# ];
# }
# {
# 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"
# "1436984534712451105"
# "1436983282582683813"
# "1437283420312047659"
# "1437089201651847315"
# "1467307140443148288"
# ];
# }
# {
# id = "zbmj00xw7d8";
# name = "goop chats";
# color = 14876549;
# collapsed = false;
# channels = [
# "1437132769141719040"
# "1445549416516681902"
# "1458849972815663209"
# ];
# }
# ];
# };
};
}

View file

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

View file

@ -12,4 +12,13 @@
theme = "Dracula";
};
};
# other commands that make normal utils prettier
home.packages = with pkgs.bat-extras; [
batdiff
batgrep
batman
batwatch
prettybat
];
}

View file

@ -18,7 +18,7 @@
background_update = true;
update_ms = 2000;
rounded_corners = false;
graph_symbol = "braille"; # braille/block/tty
graph_symbol = "block"; # braille/block/tty
graph_symbol_cpu = "default";
graph_symbol_mem = "default";
graph_symbol_net = "default";

View file

@ -1,13 +1,69 @@
{
config,
pkgs,
# upkgs,
...
}: {
# read https://docs.helix-editor.com/editor.html
}: 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 = pkgs.ty; # DEBUG: 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 = {
enable = true;
settings = {
theme = "dracula";
editor = {
line-number = "absolute";
popup-border = "all";
@ -107,7 +163,8 @@
};
};
languages.language = [
languages = {
language = [
{
name = "nix";
indent = {
@ -120,6 +177,7 @@
};
auto-format = true;
formatter.command = "${pkgs.alejandra}/bin/alejandra";
language-servers = ["nixd"];
}
{
name = "python";
@ -129,7 +187,79 @@
};
auto-format = false; # my python is beautiful ^_^
rulers = [80];
language-servers = ["ty"];
}
{
name = "c";
file-types = ["c" "h"]; # use .hpp for C++
auto-format = true;
formatter.command = "${pkgs.clang-tools}/bin/clang-format";
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 =
lsps
|> builtins.mapAttrs (_: lsp: {command = "${lsp.pkg}/bin/${lsp.cmd}";});
};
};
}

View file

@ -0,0 +1,247 @@
# TODO: look into changing to this:
# https://github.com/BirdeeHub/nix-wrapper-modules
{
inputs,
pkgs,
mpkgs,
...
}: let
inherit
(inputs.nixcats)
utils
;
in {
imports = [
inputs.nixcats.homeModule
];
config = {
# this value, nixCats is the defaultPackageName you pass to mkNixosModules
# it will be the namespace for your options.
nixCats = {
enable = true;
nixpkgs_version = inputs.nixpkgs-unstable;
# this will add the overlays from ./overlays and also,
# add any plugins in inputs named "plugins-pluginName" to pkgs.neovimPlugins
# It will not apply to overall system, just nixCats.
addOverlays =
# (import ./overlays inputs) ++
[
(utils.standardPluginOverlay inputs)
];
# see the packageDefinitions below.
# This says which of those to install.
packageNames = ["cryvim"];
luaPath = "${./.}";
# the .replace vs .merge options are for modules based on existing configurations,
# they refer to how multiple categoryDefinitions get merged together by the module.
# for useage of this section, refer to :h nixCats.flake.outputs.categories
categoryDefinitions.replace = {
pkgs,
settings,
categories,
extra,
name,
mkNvimPlugin,
...
} @ packageDef: {
lspsAndRuntimeDeps = with pkgs; {
general = [
ripgrep
fd
];
treesitter = [
tree-sitter
];
lang = {
lua = [
lua-language-server
stylua
];
nix = [
nil
nix-doc # TODO: i forgot what this is for
nixfmt
];
rust = [
cargo
mpkgs.rust-analyzer
rustfmt
];
zig = [
pkgs.zls # FIX: using spkgs version as zls is broken rn ;-;
];
elixir = [
elixir-ls
];
gleam = [
gleam
];
haskell = [
haskell-language-server
ormolu
];
java = [
jdt-language-server
javaPackages.compiler.openjdk17
javaPackages.compiler.openjdk21
];
protobuf = [
protols
buf
];
};
};
startupPlugins = with pkgs.vimPlugins; {
general = [
lze
plenary-nvim
nvim-notify
nvim-web-devicons
base16-nvim
mini-nvim
];
treesitter = [
nvim-treesitter-textobjects
nvim-treesitter.withAllGrammars
];
};
optionalPlugins = with pkgs.vimPlugins; {
general = [
];
ui = [
dressing-nvim
];
qol = [
undotree
mini-hipatterns
];
telescope = [
telescope-nvim
telescope-fzf-native-nvim
telescope-ui-select-nvim
];
fyler = [
fyler-nvim
];
lsp = [
nvim-lspconfig
];
completion = [
blink-cmp
nvim-cmp
luasnip
friendly-snippets
cmp_luasnip
cmp-buffer
cmp-path
cmp-nvim-lua
cmp-nvim-lsp
cmp-cmdline
cmp-nvim-lsp-signature-help
cmp-cmdline-history
lspkind-nvim
];
format = [
conform-nvim
];
comment = [
comment-nvim
];
lang = {
java = [
nvim-jdtls
];
};
};
# shared libraries to be added to LD_LIBRARY_PATH
# variable available to nvim runtime
sharedLibraries = {
general = with pkgs; [
# libgit2
];
};
environmentVariables = {
lang = {
rust.lsp = {
# it literally won't see the rust-analyzer provided to it
# if you don't use an envrionment variable to tell it
RUST_ANALYZER_CMD = "${mpkgs.rust-analyzer}/bin/rust-analyzer";
};
elixir.lsp = {
ELIXIR_LS_CMD = "${pkgs.elixir-ls}/scripts/language_server.sh";
};
java.lsp = {
JAVA_HOME = "${pkgs.javaPackages.compiler.openjdk17}";
OPENJDK_17 = "${pkgs.javaPackages.compiler.openjdk17}";
OPENJDK_21 = "${pkgs.javaPackages.compiler.openjdk21}";
};
};
};
extraWrapperArgs = {};
# lists of the functions you would have passed to
# python.withPackages or lua.withPackages
# get the path to this python environment
# in your lua config via
# vim.g.python3_host_prog
# or run from nvim terminal via :!<packagename>-python3
extraPython3Packages = {};
# populates $LUA_PATH and $LUA_CPATH
extraLuaPackages = {};
};
# see :help nixCats.flake.outputs.packageDefinitions
packageDefinitions.replace = {
# these are the names of your packages
# you can include as many as you wish.
cryvim = {pkgs, ...}: {
# they contain a settings set defined above
# see :help nixCats.flake.outputs.settings
settings = {
wrapRc = true;
# IMPORTANT:
# your alias may not conflict with your other packages.
aliases = [
"cvim"
];
};
# and a set of categories that you want
# (and other information to pass to lua)
categories = {
general = true;
ui = true;
qol = true;
telescope = true;
fyler = true;
lsp = true;
completion = true;
treesitter = true;
format = true;
comment = true;
lang = {
lua = true;
nix = true;
rust = true;
zig = true;
elixir = true;
gleam = true;
haskell = true;
java = true;
protobuf = true;
};
};
};
};
};
};
}

View file

@ -0,0 +1,9 @@
vim.g.mapleader = " "
vim.opt.termguicolors = true -- use terminal colors
vim.opt.relativenumber = true
vim.opt.wrap = false
vim.opt.colorcolumn = "80"
require("plugins")
require("lsp")

View file

@ -0,0 +1,66 @@
local M = {}
function M.on_attach(_, bufnr)
-- we create a function that lets us more easily define mappings specific
-- for LSP related items. It sets the mode, buffer and description for us each time.
local nmap = function(keys, func, desc)
if desc then
desc = "LSP: " .. desc
end
vim.keymap.set("n", keys, func, { buffer = bufnr, desc = desc })
end
nmap("<leader>rn", vim.lsp.buf.rename, "[R]e[n]ame")
nmap("<leader>ca", vim.lsp.buf.code_action, "[C]ode [A]ction")
nmap("gd", vim.lsp.buf.definition, "[G]oto [D]efinition")
-- NOTE: why are these functions that call the telescope builtin?
-- because otherwise they would load telescope eagerly when this is defined.
-- due to us using the on_require handler to make sure it is available.
if nixCats("general.telescope") then
nmap("gr", function()
require("telescope.builtin").lsp_references()
end, "[G]oto [R]eferences")
nmap("gI", function()
require("telescope.builtin").lsp_implementations()
end, "[G]oto [I]mplementation")
nmap("<leader>ds", function()
require("telescope.builtin").lsp_document_symbols()
end, "[D]ocument [S]ymbols")
nmap("<leader>ws", function()
require("telescope.builtin").lsp_dynamic_workspace_symbols()
end, "[W]orkspace [S]ymbols")
nmap("<leader>dd", "<cmd>Telescope diagnostics bufnr=0<CR>", "[D]ocument [D]iagnostics")
nmap("<leader>wd", "<cmd>Telescope diagnostics<CR>", "[W]orkspace [D]iagnostics")
end -- TODO: someone who knows the builtin versions of these to do instead help me out please.
nmap("<leader>D", vim.lsp.buf.type_definition, "Type [D]efinition")
nmap("<leader>e", vim.diagnostic.open_float, "Show [E]rror")
-- See `:help K` for why this keymap
nmap("K", vim.lsp.buf.hover, "Hover Documentation")
nmap("<C-k>", vim.lsp.buf.signature_help, "Signature Documentation")
-- Lesser used LSP functionality
nmap("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
nmap("<leader>wa", vim.lsp.buf.add_workspace_folder, "[W]orkspace [A]dd Folder")
nmap("<leader>wr", vim.lsp.buf.remove_workspace_folder, "[W]orkspace [R]emove Folder")
nmap("<leader>wl", function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, "[W]orkspace [L]ist Folders")
-- Create a command `:Format` local to the LSP buffer
vim.api.nvim_buf_create_user_command(bufnr, "Format", function(_)
vim.lsp.buf.format()
end, { desc = "Format current buffer with LSP" })
end
function M.get(server_name)
local capabilities = require("blink.cmp").get_lsp_capabilities()
return capabilities
end
return M

View file

@ -0,0 +1,103 @@
return {
{
"friendly-snippets",
dep_of = { "blink.cmp" },
},
{
"blink.cmp",
event = { "InsertEnter", "CmdlineEnter" },
on_require = "blink",
load = function(name)
vim.cmd.packadd(name)
end,
after = function(plugin)
local blink = require("blink.cmp")
blink.setup({
keymap = {
["<C-space>"] = { "show", "show_documentation", "hide_documentation" },
["<C-e>"] = { "hide", "fallback" },
["<C-y>"] = { "select_and_accept", "fallback" },
["<C-k>"] = { "select_prev", "fallback_to_mappings" },
["<C-j>"] = { "select_next", "fallback_to_mappings" },
["<Up>"] = { "select_prev", "fallback" },
["<Down>"] = { "select_next", "fallback" },
["<C-b>"] = { "scroll_documentation_up", "fallback" },
["<C-f>"] = { "scroll_documentation_down", "fallback" },
["<Tab>"] = { "snippet_forward", "fallback" },
["<S-Tab>"] = { "snippet_backward", "fallback" },
["<C-S-k>"] = { "show_signature", "hide_signature", "fallback" },
},
appearance = {
nerd_font_variant = "mono",
},
sources = {
default = { "lsp", "path", "snippets", "buffer" },
providers = {
lsp = {
name = "LSP",
module = "blink.cmp.sources.lsp",
enabled = true,
},
path = {
name = "Path",
module = "blink.cmp.sources.path",
enabled = true,
},
snippets = {
name = "Snippets",
module = "blink.cmp.sources.snippets",
enabled = true,
},
buffer = {
name = "Buffer",
module = "blink.cmp.sources.buffer",
enabled = true,
},
},
},
completion = {
accept = {
auto_brackets = {
enabled = true,
},
},
menu = {
border = "rounded",
max_height = 12,
scrolloff = 2,
draw = {
columns = {
{ "kind_icon", gap = 1 },
{ "label", "label_description", gap = 1 },
},
},
},
documentation = {
auto_show = false,
window = {
border = "rounded",
},
},
},
signature = {
enabled = true,
window = {
border = "rounded",
},
},
})
end,
},
}

View file

@ -0,0 +1,20 @@
vim.api.nvim_create_autocmd("FileType", {
pattern = { "lua", "nix", "gleam" },
callback = function()
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.expandtab = true
end,
})
vim.api.nvim_create_autocmd("User", {
pattern = "TelescopePreviewerLoaded",
callback = function(args)
local ft = args.data.filetype
if vim.tbl_contains({ "lua", "nix", "gleam", "rust" }, ft) then
vim.bo.shiftwidth = 2
vim.bo.tabstop = 2
vim.bo.expandtab = true
end
end,
})

View file

@ -0,0 +1,6 @@
require("lze").load({
{ import = "lsp.completion" },
})
require("lsp.indentation")
require("lsp.lsp")

View file

@ -0,0 +1,134 @@
local servers = {}
servers.lua_ls = {
settings = {
Lua = {
formatters = {
ignoreComments = false,
},
signatureHelp = { enable = true },
diagnostics = {
globals = { "nixCats", "vim" },
-- disable = { 'missing-fields' },
},
workspace = {
-- make the server aware of the neovim runtime files
library = vim.api.nvim_get_runtime_file("", true),
checkThirdParty = false,
},
},
telemetry = { enabled = false },
},
}
servers.nil_ls = {
settings = {},
}
local rust_analyzer_cmd = os.getenv("RUST_ANALYZER_CMD")
servers.rust_analyzer = {
cmd = { rust_analyzer_cmd },
settings = {
server = {
-- For debugging rust-analyzer, to see log location do :LspInfo in neovim
-- extraEnv = { {["RA_LOG"]="project_model=debug"} },
},
cargo = {
allFeatures = false,
allTargets = false,
buildScripts = { enable = true },
target = "x86_64-unknown-linux-gnu",
},
diagnostics = {
enable = true,
},
},
}
servers.zls = {
settings = {},
}
local elixir_ls_cmd = os.getenv("ELIXIR_LS_CMD")
servers.elixirls = {
cmd = { elixir_ls_cmd },
settings = {},
}
servers.gleam = {
settings = {},
}
servers.hls = {
settings = {},
}
local java_home = os.getenv("JAVA_HOME")
servers.jdtls = {
settings = {
java = {
contentProvider = { preferred = "fernflower" },
configuration = {
runtimes = {
{
name = "OpenJDK 17",
path = os.getenv("OPENJDK_17"),
},
{
name = "OpenJDK 21",
path = os.getenv("OPENJDK_21"),
},
},
},
},
},
}
servers.protols = {
settings = {},
}
-- Taken from nixCats example:
-- If you were to comment out this autocommand
-- and instead pass the on attach function directly to
-- nvim-lspconfig, it would do the same thing.
-- come to think of it, it might be better because then lspconfig doesnt have to be called before lsp attach?
-- but you would still end up triggering on a FileType event anyway, so, it makes little difference.
vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("nixCats-lsp-attach", { clear = true }),
callback = function(event)
require("lsp.capabilities").on_attach(vim.lsp.get_client_by_id(event.data.client_id), event.buf)
end,
})
require("lze").load({
{
"nvim-lspconfig",
event = "FileType",
after = function(plugin)
-- Just register configs, don't enable yet
for server_name, cfg in pairs(servers) do
vim.lsp.config(server_name, {
capabilities = require("lsp.capabilities").get(server_name),
settings = (cfg or {}).settings,
filetypes = (cfg or {}).filetypes,
cmd = (cfg or {}).cmd,
root_pattern = (cfg or {}).root_pattern,
})
end
-- Enable on-demand per filetype
for server_name, cfg in pairs(servers) do
local filetypes = cfg.filetypes or vim.lsp.config[server_name].filetypes
if filetypes then
vim.api.nvim_create_autocmd("FileType", {
pattern = filetypes,
callback = function()
vim.lsp.enable(server_name)
end,
})
end
end
end,
},
})

View file

@ -0,0 +1,23 @@
return {
{
"comment.nvim",
event = { "BufReadPost", "BufNewFile" },
after = function(plugin)
require("Comment").setup({
toggler = {
line = "<leader>cc",
block = "<leader>bc",
},
opleader = {
line = "<leader>c",
block = "<leader>b",
},
extra = {
above = "<leader>c<S-o>",
below = "<leader>co",
eol = "<leader>cA",
},
})
end,
},
}

View file

@ -0,0 +1,5 @@
return {
{
"dressing.nvim",
},
}

View file

@ -0,0 +1,34 @@
-- docs -> https://github.com/stevearc/conform.nvim
return {
{
"conform.nvim",
enabled = nixCats("format") or false,
keys = {
{ "<leader>p", desc = "Format File (pretty :3)" },
},
after = function(plugin)
local conform = require("conform")
conform.setup({
formatters_by_ft = {
lua = nixCats("lang.lua") and { "stylua" } or nil,
nix = nixCats("lang.nix") and { "nixfmt" } or nil,
rust = nixCats("lang.rust") and { "rustfmt", lsp_format = "fallback" } or nil,
haskell = nixCats("lang.haskell") and { "ormolu" } or nil,
proto = nixCats("lang.protobuf") and { "buf" } or nil,
},
format_on_save = {
timeout_ms = 500,
},
})
vim.keymap.set({ "n", "v" }, "<leader>p", function()
conform.format({
lsp_fallback = false,
async = false,
timeout_ms = 1000,
})
end, { desc = "Format File (pretty :3)" })
end,
},
}

View file

@ -0,0 +1,22 @@
return {
{
"fyler.nvim",
cmd = { "Fyler" },
keys = {
{
"<leader>tf",
function()
return require("fyler").toggle({ kind = "split_right" })
end,
mode = { "n" },
desc = "Open [F]yler",
},
},
load = function(name)
vim.cmd.packadd(name)
end,
after = function(plugin)
local fyler = require("fyler").setup()
end,
},
}

View file

@ -0,0 +1,9 @@
require("lze").load({
{ import = "plugins.dressing" },
{ import = "plugins.telescope" },
{ import = "plugins.treesitter" },
{ import = "plugins.fyler" },
{ import = "plugins.mini-hipatterns" },
{ import = "plugins.format" },
{ import = "plugins.comment" },
})

View file

@ -0,0 +1,76 @@
return {
{
"mini.hipatterns",
after = function(plugin)
local hipatterns = require("mini.hipatterns")
-- Returns hex color group for matching short hex color.
--
---@param match string
---@return string
local hex_color_short = function(_, match)
local style = "fg" -- 'fg' or 'bg', for extmark_opts_inline use 'fg'
local r, g, b = match:sub(2, 2), match:sub(3, 3), match:sub(4, 4)
local hex = string.format("#%s%s%s%s%s%s", r, r, g, g, b, b)
return hipatterns.compute_hex_color_group(hex, style)
end
-- Returns hex color group for matching alpha hex color.
--
---@param match string
---@return string
local hex_color_alpha = function(_, match)
local style = "fg" -- 'fg' or 'bg', for extmark_opts_inline use 'fg'
local r, g, b = match:sub(2, 3), match:sub(4, 5), match:sub(6, 7)
local hex = string.format("#%s%s%s", r, g, b)
return hipatterns.compute_hex_color_group(hex, style)
end
-- Returns extmark opts for highlights with virtual inline text.
--
---@param data table Includes `hl_group`, `full_match` and more.
---@return table
local extmark_opts_inline = function(_, _, data)
return {
virt_text = { { "󰧞", data.hl_group } },
virt_text_pos = "inline",
right_gravity = false,
}
end
-- Returns extmark opts for highlights with virtual inline text.
--
---@param data table Includes `hl_group`, `full_match` and more.
---@return table
local extmark_opts_inline_alpha = function(_, _, data)
return {
virt_text = { { "󱡓", data.hl_group } },
virt_text_pos = "inline",
right_gravity = false,
}
end
hipatterns.setup({
highlighters = {
-- #rrggbb
hex_color = hipatterns.gen_highlighter.hex_color({
style = "inline",
inline_text = "󰧞",
}),
-- #rgb
hex_color_short = {
pattern = "#%x%x%x%f[%X]",
group = hex_color_short,
extmark_opts = extmark_opts_inline,
},
-- #rrggbbaa
hex_color_alpha = {
pattern = "#%x%x%x%x%x%x%x%x%f[%X]",
group = hex_color_alpha,
extmark_opts = extmark_opts_inline_alpha,
},
},
})
end,
},
}

View file

@ -0,0 +1,78 @@
return {
{
"telescope.nvim",
cmd = { "Telescope" },
keys = {
{
"<leader>f",
function()
return require("telescope.builtin").find_files()
end,
mode = { "n" },
desc = "Telescope search [F]iles",
},
{
"<leader>tr",
function()
return require("telescope.builtin").oldfiles()
end,
mode = { "n" },
desc = "[T]elescope search [R]ecent files",
},
{
"<leader>ts",
function()
return require("telescope.builtin").live_grep()
end,
mode = { "n" },
desc = "[T]elescope [S]earch cwd with grep",
},
{
"<leader>tw",
function()
return require("telescope.builtin").grep_string()
end,
mode = { "n" },
desc = "[T]elescope search current [W]ord",
},
{
"<leader>tk",
function()
return require("telescope.builtin").keymaps()
end,
mode = { "n" },
desc = "[T]elescope search [K]eymaps",
},
{
"<leader>tb",
function()
return require("telescope.builtin").buffers()
end,
mode = { "n" },
desc = "[T]elescope search [B]uffers",
},
},
load = function(name)
vim.cmd.packadd(name)
vim.cmd.packadd("telescope-fzf-native.nvim")
end,
after = function(plugin)
local telescope = require("telescope")
local actions = require("telescope.actions")
telescope.setup({
defaults = {
mappings = {
i = {
["<C-k>"] = actions.move_selection_previous, -- move to prev result
["<C-j>"] = actions.move_selection_next, -- move to next result
["<C-q>"] = actions.send_selected_to_qflist + actions.open_qflist,
},
},
},
})
pcall(telescope.load_extension, "fzf")
end,
},
}

View file

@ -0,0 +1,95 @@
-- to help me write this after nvim-treesitter updated, i used:
-- https://github.com/BirdeeHub/nixCats-nvim/blob/3c9bc4d7123e1b48d92f25ba505b889af541e897/templates/example/lua/myLuaConf/plugins/treesitter.lua
return {
{
"nvim-treesitter",
lazy = false,
after = function(plugin)
--@param buf integer
--@param language string
local function treesitter_try_attach(buf, language)
--check if parser exists and load it
if not vim.treesitter.language.add(language) then
return
end
-- enables syntax highlight and other treesitter features
vim.treesitter.start(buf, language)
-- enables treesitter based folds
vim.wo.foldexpr = "v:lua.vim.treesitter.foldexpr()"
-- enables treesiter based indentation
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end
local available_parsers = require("nvim-treesitter").get_available()
vim.api.nvim_create_autocmd("FileType", {
callback = function(args)
local buf, filetype = args.buf, args.match
local language = vim.treesitter.language.get_lang(filetype)
if not language then
return
end
local installed_parsers = require("nvim-treesitter").get_installed("parsers")
if vim.tbl_contains(installed_parsers, language) then
-- enable the parser if it is installed
treesitter_try_attach(buf, language)
elseif vim.tbl_contains(available_parsers, language) then
-- if a parser is available in `nvim-treesitter` enable it after ensuring it is installed
require("nvim-treesitter").install(language):await(function()
treesitter_try_attach(buf, language)
end)
else
-- try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
treesitter_try_attach(buf, language)
end
end,
})
end,
},
{
"nvim-treesitter-textobjects",
lazy = false,
before = function(plugin)
vim.g.no_plugin_maps = true
end,
after = function(plugin)
require("nvim-treesitter-textobjects").setup({
select = {
lookahead = true,
selection_modes = {
["@parameter.outer"] = "v", -- charwise
["@function.outer"] = "V", -- linewise
},
include_surrounding_whitespace = false,
},
})
-- keymaps
vim.keymap.set({ "x", "o" }, "am", function()
require("nvim-treesitter-textobjects.select").select_textobject("@function.outer", "textobjects")
end)
vim.keymap.set({ "x", "o" }, "im", function()
require("nvim-treesitter-textobjects.select").select_textobject("@function.inner", "textobjects")
end)
vim.keymap.set({ "x", "o" }, "ac", function()
require("nvim-treesitter-textobjects.select").select_textobject("@class.outer", "textobjects")
end)
vim.keymap.set({ "x", "o" }, "ic", function()
require("nvim-treesitter-textobjects.select").select_textobject("@class.inner", "textobjects")
end)
-- You can also use captures from other query groups like `locals.scm`
vim.keymap.set({ "x", "o" }, "as", function()
require("nvim-treesitter-textobjects.select").select_textobject("@local.scope", "locals")
end)
-- NOTE: for more textobjects options, see the following link.
-- This template is using the new `main` branch of the repo.
-- https://github.com/nvim-treesitter/nvim-treesitter-textobjects/tree/main
end,
},
}

View file

@ -1,24 +0,0 @@
{
config,
pkgs,
...
}: {
programs.nixvim = {
enable = true;
# TODO: allow clipboard to be configurable based on system clipboard
colorschemes.dracula.enable = true;
plugins = {
lualine.enable = true;
treesitter.enable = true;
};
opts = {
number = true;
tabstop = 4;
softtabstop = 4;
shiftwidth = 4;
};
clipboard.providers.wl-copy.enable = true;
};
}

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

@ -0,0 +1,37 @@
{
lib,
pkgs,
...
}: {
# REF: https://home-manager-options.extranix.com/?query=vscode&release=release-25.05
programs.vscode = {
enable = true;
package = pkgs.vscodium;
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
# 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

@ -1,14 +1,84 @@
{
config,
lib,
pkgs,
...
}: {
options = {
morphBashToFish = lib.mkEnableOption "morphBashToFish";
};
# TODO: make the greeting controllable (ie so my VPS can be different)
config = {
programs.fish = {
enable = true;
interactiveShellInit = ''
#set -g fish_greeting "Welcome weary traveler to my shop"
cat ~/banner
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..."
"I once again retreat to the sanctuary of my virtual realm"
"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!"
"A broken heart beats in fractals" # Key Fairy
"Remember our promise" # Signalis
]
|> map (x: "\"${x}\"")
|> builtins.concatStringsSep " ";
in ''
# add dotnet completions if it exists (ie we're in a virtual environment)
if type -q dotnet
complete -f -c dotnet -a "(dotnet complete (commandline -cp))"
end
function rand_greet
set greetings ${greetings}
echo -n $greetings[(random 1 (count $greetings))]
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)
'';
shellAliases = {
brip = "batgrep"; # bat + ripgrep
man = "batman"; # bat + man
ls = "eza --color=auto";
l = "eza -Alh --color=auto --icons=auto";
ll = "eza -lh --color=auto --icons=auto";
li = "eza --color=auto --git-ignore";
};
plugins = [
{
name = "grc";
@ -16,4 +86,5 @@
}
];
};
};
}

View file

@ -5,7 +5,70 @@
}: {
programs.git = {
enable = true;
userName = "Emile Clark-Boman";
userEmail = "eclarkboman@gmail.com";
lfs.enable = true;
signing = {
# key = "F68745A836CA0412";
# format = "openpgp";
# signByDefault = true;
};
settings = {
user.name = "_cry64";
user.email = "them@dobutterfliescry.net";
alias = {
s = "status";
d = "diff";
l = "log";
c = "commit";
p = "push";
};
color.ui = true;
core.editor = "hx";
github.user = "cry128";
init = {
defaultBranch = "main";
};
url = {
"git@github.com:" = {
insteadOf = [
"gh:"
"github:"
];
};
"https://gitlab.com/" = {
insteadOf = [
"gl:"
"gitlab:"
];
};
"git@codeberg.org:" = {
insteadOf = [
"cb:"
"codeberg:"
];
};
"git@tearforge.net/" = {
insteadOf = [
"cry:"
"forge:"
];
};
};
};
includes = [
{
path = "/home/me/agribit/.gitconfig";
condition = "gitdir:/home/me/agribit/**";
}
# {
# path = "/home/me/luminary/.gitconfig";
# condition = "gitdir:/home/me/luminary/**";
# }
];
};
}

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;
};
};
};
}

View file

@ -1,16 +0,0 @@
{
config,
pkgs,
...
}: {
programs.nixcord = {
enable = true;
config = {
frameless = true;
plugins = {
# TODO: remove this plugin
hideAttachments.enable = true;
};
};
};
}

16
homes/modules/obs.nix Executable file
View file

@ -0,0 +1,16 @@
{
config,
pkgs,
...
}: {
programs = {
obs-studio = {
enable = true;
plugins = with pkgs.obs-studio-plugins; [
wlrobs
obs-backgroundremoval
obs-pipewire-audio-capture
];
};
};
}

View file

@ -1,17 +0,0 @@
{...}: {
# simple fail2ban config (not production ready or anything though)
# refer to: https://nixos.wiki/wiki/Fail2Ban
services.fail2ban = {
enable = true;
maxretry = 5;
bantime = "10m"; # 10 minute ban
bantime-increment = {
enable = true;
formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
multipliers = "1 2 4 8 16 32 64";
maxtime = "168h"; # dont ban for more than 1 week
overalljails = true;
};
};
}

View file

@ -1,35 +0,0 @@
{...}: {
services = {
# use nginx as the reverse proxy
# (also will use certbot and Let's Encrypt)
# refer to: https://nixos.wiki/wiki/Nginx
nginx = {
enable = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
# https://imbored.dev
virtualHosts = {
"imbored.dev" = {
forceSSL = true;
enableACME = true;
# config reverse proxy paths
locations = {
"/" = {
# TODO
proxyPass = "http://127.0.0.1:12345";
};
};
};
};
};
};
security.acme = {
acceptTerms = true;
defaults.email = "eclarkboman@gmail.com";
};
}

View file

@ -1,13 +0,0 @@
{...}: {
services.openssh = {
enable = true;
ports = [22];
settings = {
PasswordAuthentication = true;
PermitRootLogin = "no";
AllowUsers = null; # allow all users by default
UseDns = true;
X11Forwarding = false;
};
};
}

View file

@ -0,0 +1,9 @@
{
lib,
...
}:
{
options = {
}
}

328
homes/modules/term/foot.nix Normal file
View file

@ -0,0 +1,328 @@
# DEBUG: {upkgs, ...}: {
{pkgs, ...}: {
programs.foot = {
enable = true;
package = pkgs.foot; # DEBUG: upkgs.foot;
server.enable = true;
settings = let
none = "\"\"";
in {
main = {
term = "foot"; # set $TERM
login-shell = "no";
title = "foot";
locked-title = "no";
# font = "GeistMono Nerd Font:size=12";
# font = "Mononoki Nerd Font Mono:size=12";
# font = "0xProto Nerd Font Mono:size=12";
font = "JetBrainsMonoNL Nerd Font:size=12";
# font-bold = "";
# font-italice = "";
# font-bold-italice = "";
# font-size-adjustment = 0.5;
# line-height = ...;
# letter-spacing = 0;
# horizontal-letter-offset = 0;
# vertical-letter-offset = 0;
# underline-offset = ...;
# underline-thickness = ...;
# strikeout-thickness = ...;
box-drawings-uses-font-glyphs = "no";
dpi-aware = "no";
gamma-correct-blending = "no";
initial-color-theme = "1";
# initial-window-size-pixels = "700x500"; # pixel COLSxROWS
initial-window-size-chars = "90x26"; # char COLSxROWS
initial-window-mode = "windowed";
pad = "32x32 center-when-maximized-and-fullscreen";
resize-by-cells = "yes";
resize-keep-grid = "yes";
resize-delay-ms = "100";
bold-text-in-bright = "no";
word-delimiters = ",`|:\"'()[]{}<>";
selection-target = "primary";
# workers = ...; # number of logical CPUs
};
# environment = {
# name = "value";
# }
security = {
osc52 = "enabled";
};
bell = {
system = "no";
urgent = "no";
notify = "no";
visual = "no";
# command = ...;
# command-focused = "no";
};
desktop-notifications = {
command = "notify-send --wait --app-name \${app-id} --icon \${app-id} --category \${category} --urgency \${urgency} --expire-time \${expire-time} --hint STRING:image-path:\${icon} --hint BOOLEAN:suppress-sound:\${muted} --hint STRING:sound-name:\${sound-name} --replace-id \${replace-id} \${action-argument} --print-id -- \${title} \${body}";
command-action-argument = "--action \${action-name=\${action-label}}";
close = none;
inhibit-when-focused = "no";
};
scrollback = {
lines = 1000;
multiplier = 1.0;
indicator-position = "relative";
indicator-format = none;
};
url = {
launch = "xdg-open \${url}";
label-letters = "sadfjklewcmpgh";
osc8-underline = "url-mode";
regex = "(((https?://|mailto:|ftp://|file:|ssh:|ssh://|git://|tel:|magnet:|ipfs://|ipns://|gemini://|gopher://|news:)|www\\.)([0-9a-zA-Z:/?#@!$&*+,;=.~_%^\\-]+|\\([]\\[\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\)|\\[[\\(\\)\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\]|\"[]\\[\\(\\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\"|'[]\\[\\(\\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\\-]*')+([0-9a-zA-Z/#@$&*+=~_%^\\-]|\\([]\\[\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\)|\\[[\\(\\)\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\]|\"[]\\[\\(\\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\"|'[]\\[\\(\\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\\-]*'))";
};
# "regex:your-fancy-name" = {
# regex = ...;
# launch = "[path to script/application] \${match}"
# };
#
# key-bindings = {
# regex-launch = "[your-fancy-name] Control+Shift+q";
# regex-copy = "[your-fancy-name] Control+Alt+shift+q";
# };
cursor = {
style = "block";
blink = "no";
# blink-rate = 500;
beam-thickness = 1.0;
# underline-thickness = ...;
};
mouse = {
hide-when-typing = "yes";
alternate-scroll-mode = "yes";
};
touch = {
long-press-delay = 400;
};
# Theme: Dracula
# REF: https://github.com/dracula/foot
colors = {
alpha = 1.0;
alpha-mode = "default"; # default/matching/all
background = "282a36";
foreground = "f8f8f2";
## Normal/regular colors (color palette 0-7)
regular0 = "21222c"; # black
regular1 = "ff5555"; # red
regular2 = "50fa7b"; # green
regular3 = "f1fa8c"; # yellow
regular4 = "bd93f9"; # blue
regular5 = "ff79c6"; # magenta
regular6 = "8be9fd"; # cyan
regular7 = "f8f8f2"; # white
## Bright colors (color palette 8-15)
bright0 = "6272a4"; # bright black
bright1 = "ff6e6e"; # bright red
bright2 = "69ff94"; # bright green
bright3 = "ffffa5"; # bright yellow
bright4 = "d6acff"; # bright blue
bright5 = "ff92df"; # bright magenta
bright6 = "a4ffff"; # bright cyan
bright7 = "ffffff"; # bright white
## Misc colors
selection-foreground = "ffffff";
selection-background = "44475a";
# jump-labels=<regular0> <regular3> # black-on-yellow
# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue
# search-box-no-match=<regular0> <regular1> # black-on-red
# search-box-match=<regular0> <regular3> # black-on-yellow
urls = "8be9fd";
flash = "7f7f00";
flash-alpha = 0.5;
};
# Alternative colour palette (see `man 5 foot.ini`)
colors2 = {
alpha = 1.0;
alpha-mode = "default";
background = "191724";
foreground = "e0def4";
regular0 = "26233a"; # black (Overlay)
regular1 = "eb6f92"; # red (Love)
regular2 = "9ccfd8"; # green (Foam)
regular3 = "f6c177"; # yellow (Gold)
regular4 = "31748f"; # blue (Pine)
regular5 = "c4a7e7"; # magenta (Iris)
regular6 = "ebbcba"; # cyan (Rose)
regular7 = "e0def4"; # white (Text)
bright0 = "47435d"; # bright black (lighter Overlay)
bright1 = "ff98ba"; # bright red (lighter Love)
bright2 = "c5f9ff"; # bright green (lighter Foam)
bright3 = "ffeb9e"; # bright yellow (lighter Gold)
bright4 = "5b9ab7"; # bright blue (lighter Pine)
bright5 = "eed0ff"; # bright magenta (lighter Iris)
bright6 = "ffe5e3"; # bright cyan (lighter Rose)
bright7 = "fefcff"; # bright white (lighter Text)
selection-foreground = "ffffff";
selection-background = "393553";
urls = "ebbcba"; # Rose
flash = "f6c177"; # yellow (Gold)
flash-alpha = 0.5;
cursor = "191724 e0def4";
};
# csd = {
# preferred = "server";
# size = 26;
# font = ...;
# color = ...; # foreground color
# hide-when-maximized = "no";
# border-width = 0;
# border-color = ...;
# button-width = 26;
# button-color = ...; # background color
# button-minimize-color = ...;
# button-maximize-color = ...;
# button-close-color = ...;
# };
key-bindings = {
scrollback-up-page = "Shift+Page_Up Shift+KP_Page_Up";
# scrollback-up-half-page = "none";
# scrollback-up-line = "none";
scrollback-down-page = "Shift+Page_Down Shift+KP_Page_Down";
# scrollback-down-half-page = "none";
# scrollback-down-line = "none";
# scrollback-home = "none";
# scrollback-end = "none";
clipboard-copy = "Control+Shift+c XF86Copy";
clipboard-paste = "Control+Shift+v XF86Paste";
primary-paste = "Shift+Insert";
search-start = "Control+Shift+r";
font-increase = "Control+plus Control+equal Control+KP_Add";
font-decrease = "Control+minus Control+KP_Subtract";
font-reset = "Control+0 Control+KP_0";
spawn-terminal = "Control+Shift+n";
# minimize = "none";
# maximize = "none";
# fullscreen = "none";
pipe-visible = "[sh -c \"xurls | fuzzel | xargs -r firefox\"] none";
pipe-scrollback = "[sh -c \"xurls | fuzzel | xargs -r firefox\"] none";
pipe-selected = "[xargs -r firefox] none";
pipe-command-output = "[wl-copy] none";
show-urls-launch = "Control+Shift+o";
# show-urls-copy = "none";
# show-urls-persistent = "none";
prompt-prev = "Control+Shift+z";
prompt-next = "Control+Shift+x";
unicode-input = "Control+Shift+u";
# color-theme-switch-1 = "none";
# color-theme-switch-2 = "none";
color-theme-toggle = "Control+Alt+p";
# noop = "none";
# quit = "none";
};
search-bindings = {
cancel = "Control+g Control+c Escape";
commit = "Return KP_Enter";
find-prev = "Control+r";
find-next = "Control+s";
cursor-left = "Left Control+b";
cursor-left-word = "Control+Left Mod1+b";
cursor-right = "Right Control+f";
cursor-right-word = "Control+Right Mod1+f";
cursor-home = "Home Control+a";
cursor-end = "End Control+e";
delete-prev = "BackSpace";
delete-prev-word = "Mod1+BackSpace Control+BackSpace";
delete-next = "Delete";
delete-next-word = "Mod1+d Control+Delete";
delete-to-start = "Control+u";
delete-to-end = "Control+k";
extend-char = "Shift+Right";
extend-to-word-boundary = "Control+w Control+Shift+Right";
extend-to-next-whitespace = "Control+Shift+w";
extend-line-down = "Shift+Down";
extend-backward-char = "Shift+Left";
extend-backward-to-word-boundary = "Control+Shift+Left";
# extend-backward-to-next-whitespace = "none";
extend-line-up = "Shift+Up";
clipboard-paste = "Control+v Control+Shift+v Control+y XF86Paste";
primary-paste = "Shift+Insert";
# unicode-input = "none";
scrollback-up-page = "Shift+Page_Up Shift+KP_Page_Up";
# scrollback-up-half-page = "none";
# scrollback-up-line = "none";
scrollback-down-page = "Shift+Page_Down Shift+KP_Page_Down";
# scrollback-down-half-page = "none";
# scrollback-down-line = "none";
# scrollback-home = "none";
# scrollback-end = "none";
};
url-bindings = {
cancel = "Control+g Control+c Control+d Escape";
toggle-url-visible = "t";
};
text-bindings = {
"\\x03" = "Mod4+c"; # map Super+c -> Control+c
};
mouse-bindings = {
scrollback-up-mouse = "BTN_WHEEL_BACK";
scrollback-down-mouse = "BTN_WHEEL_FORWARD";
font-increase = "Control+BTN_WHEEL_BACK";
font-decrease = "Control+BTN_WHEEL_FORWARD";
selection-override-modifiers = "Shift";
primary-paste = "BTN_MIDDLE";
select-begin = "BTN_LEFT";
select-begin-block = "Control+BTN_LEFT";
select-extend = "BTN_RIGHT";
select-extend-character-wise = "Control+BTN_RIGHT";
select-word = "BTN_LEFT-2";
select-word-whitespace = "Control+BTN_LEFT-2";
select-quote = "BTN_LEFT-3";
select-row = "BTN_LEFT-4";
};
};
};
}

View file

@ -0,0 +1,45 @@
{pkgs, ...}: {
home = {
packages = [
pkgs.ghostty
];
sessionVariables.TERMINAL = "ghostty";
};
programs.ghostty = {
enable = true;
settings = {
theme = "Dracula";
font-family = "Geist Nerd Font";
font-feature = ["liga" "calt"];
window-padding-x = 12;
window-padding-y = 6;
window-theme = "system";
window-height = 26;
window-width = 90;
copy-on-select = true;
gtk-single-instance = false;
adw-toolbar-style = "flat";
# disable close confirmations
confirm-close-surface = false;
keybind = [
"ctrl+shift+plus=increase_font_size:1"
"ctrl+shift+minus=decrease_font_size:1"
"ctrl+h=goto_split:left"
"ctrl+l=goto_split:right"
];
};
#themes = {
#aylur-dark = colors (import ./colors.nix {scheme = "dark";});
#aylur-light = colors (import ./colors.nix {scheme = "light";});
#};
};
}

View file

@ -3,8 +3,16 @@
pkgs,
...
}: {
home = {
packages = [
pkgs.rio
];
# currently set to ghostty (on lolcathost)
#sessionVariables.TERMINAL = "rio";
};
# The terminal I use
# TODO: this is dependent on nvim being installed
# TODO: make this into a module with a configurable editor option
programs.rio = {
enable = true;

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

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

View file

@ -0,0 +1,39 @@
{
pkgs,
lib,
...
}: let
inherit
(lib)
mkEnableOption
mkOption
types
;
in {
imports = [
./hypr/hyprland.nix
./mangowc.nix
];
options.cryos = {
wm = {
default = mkOption {
type = types.enum ["mangowc" "hyprland"];
default = "mangowc";
example = "hyprland";
description = "Window manager to boot by default.";
};
hyprland.enabled = mkEnableOption "hyprland";
mangowc.enabled = mkEnableOption "mangowc";
};
};
config = {
xdg.portal = {
enable = true;
extraPortals = with pkgs; [
# xdg-desktop-portal-gtk
];
};
};
}

View file

@ -0,0 +1,29 @@
# NOTE: hyprland must be enabled in BOTH your host config (for running hyprland)
# NOTE: and your home-manager config (for managing hyprland's config files)
{
pkgs,
inputs,
...
}: {
config = {
wayland.windowManager.hyprland = {
enable = true;
# package = pkgs.hyprland;
package = null;
portalPackage = null;
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
# ];
};
};
}

View file

@ -0,0 +1,107 @@
{...}: {
home.shellAliases = {
logoff = "mmsg -q";
};
wayland.windowManager.mango = {
enable = true;
systemd = {
enable = true;
# enable autostart of applications
# REF: `man 8 systemd-xdg-autostart-generator`
xdgAutostart = true;
};
settings = ''
# REF: config.conf
exec-once = awww-daemon
exec-once = mako
bind=SUPER,Return,spawn,foot
bind=SUPER,R,spawn,fuzzel
bind=SUPER+SHIFT,R,reload_config
bind=SUPER,Q,killclient
# Brightness
bind=NONE,XF86MonBrightnessUp,spawn,brightnessctl -e4 -n2 set 5%+
bind=NONE,XF86MonBrightnessDown,spawn,brightnessctl -e4 -n2 set 5%-
bind=SUPER+SHIFT,-,spawn brightnessctl -e4 -n2 set 5%+
bind=SUPER+SHIFT,+,spawn brightnessctl -e4 -n2 set 5%-
# Window Options
bind=SUPER,F,togglefullscreen
bind=SUPER+SHIFT,F,togglefakefullscreen
# Window Movement
bind=SUPER,Tab,focusstack,next
bind=SUPER,h,focusdir,left
bind=SUPER,l,focusdir,right
bind=SUPER,k,focusdir,up
bind=SUPER,j,focusdir,down
bind=SUPER,Left,focusdir,left
bind=SUPER,Right,focusdir,right
bind=SUPER,Up,focusdir,up
bind=SUPER,Down,focusdir,down
keymode=resize
bind=NONE,Left,resizewin,-10.0
bind=NONE,Right,resizewin,+10.0
bind=NONE,Escape,setkeymode,default
# Keyboard
repeat_rate=25
repeat_delay=300
numlockon=0
xkb_rules_layout=us
# Laptop Specific Things
# disable_trackpad=0
# mouse_natural_scrolling=1
bind=SUPER,1,view,1,0
bind=SUPER,2,view,2,0
bind=SUPER,3,view,3,0
bind=SUPER,4,view,4,0
bind=SUPER,5,view,5,0
bind=SUPER,6,view,6,0
bind=SUPER,7,view,7,0
bind=SUPER,8,view,8,0
bind=SUPER,9,view,9,0
bind=SUPER+SHIFT,1,tag,1,0
bind=SUPER+SHIFT,2,tag,2,0
bind=SUPER+SHIFT,3,tag,3,0
bind=SUPER+SHIFT,4,tag,4,0
bind=SUPER+SHIFT,5,tag,5,0
bind=SUPER+SHIFT,6,tag,6,0
bind=SUPER+SHIFT,7,tag,7,0
bind=SUPER+SHIFT,8,tag,8,0
bind=SUPER+SHIFT,9,tag,9,0
bind=SUPER+SHIFT,h,focusmon,left
bind=SUPER+SHIFT,l,focusmon,right
bind=SUPER+SHIFT,k,focusmon,up
bind=SUPER+SHIFT,j,focusmon,down
# bind=SUPER,Left,tagmon,left
# bind=SUPER,Right,tagmon,right
# bind=SUPER,Up,tagmon,up
# bind=SUPER,Down,tagmon,down
bind=SUPER,g,toggleglobal
bind=SUPER,o,toggleoverlay
bind=SUPER,a,togglefloating
bind=SUPER,z,toggle_scratchpad
'';
autostart_sh = ''
# REF: autostart.sh
# XDG_CURRENT_DESKTOP=Hyprland
# dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
'';
};
}

View file

@ -1,72 +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";
};
YearnForTheMines = {
hostname = "deadlyserver.com";
user = "emile";
port = 29843;
identityFile = "~/.ssh/id_deadlyserver";
};
};
};
};
# 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
}

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

@ -0,0 +1,91 @@
{...}: {
imports = [
./hardware.nix
./services
];
# super duper minimum grub2 config
boot.loader.grub = {
enable = true;
device = "/dev/vda";
};
networking = {
hostName = "butterfly";
firewall = {
allowedTCPPorts = [
22 # forgejo ssh
80 # nginx
# 143 # IMAP4
443 # nginx
# 587 # SMTPS
2222 # TEMP: forgejo ssh
# 3000 (INTERNAL) forgejo
# 3306 (INTERNAL) forgejo sqlite3 database
# 8222 (INTERNAL) vaultwarden
42069 # ssh
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";
# }
# ];
# };
# };
};
services.pixiecore = {
enable = false;
port = 1234;
statusPort = 1234;
openFirewall = true;
listen = "0.0.0.0";
quick = "xyz";
mode = "boot";
};
users.users = {
cry = {
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"
];
};
foxora = {
isNormalUser = true;
createHome = true;
home = "/home/foxora";
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDSBRYKap1p5lPocRTkguhJN72D2R2CImt5cFYx3Qa7h aurora@nixarawrui"
];
};
};
virtualisation.docker.enable = true;
system.stateVersion = "24.11"; # DO NOT MODIFY
}

View file

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

View file

@ -0,0 +1,181 @@
{
config,
lib,
...
}: let
cfg = config.services.forgejo;
in {
# REF: https://github.com/NixOS/nixpkgs/blob/nixos-25.11/nixos/modules/services/misc/forgejo.nix
# REF: forgejo doesn't create the user/group by default if its name isn't "forgejo"
users.users = lib.mkIf (cfg.user != "forgejo") {
${cfg.user} = {
home = cfg.stateDir;
useDefaultShell = true;
group = cfg.group;
isSystemUser = true;
};
};
users.groups = lib.mkIf (cfg.group != "forgejo") {
${cfg.group} = {};
};
# 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;
# XXX: WARNING: XXX: WARNING: XXX: TODO: set user="git" and settings.server.SSH_PORT=22
# XXX: WARNING: XXX: WARNING: XXX: TODO: (currently both cause errors)
# XXX: WARNING: XXX: WARNING: XXX: TODO: THE USER FAILS I THINK CAUSE THE DIRECTORY DOESNT CHANGE THE USER PERMISSIONS
user = "git"; # user forgejo runs as
# group = "forgejo"; # group forgejo runs as
# stateDir = "/var/lib/forgejo";
# 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 = "them@dobutterfliescry.net";
DOMAIN = "tearforge.net";
ROOT_URL = "https://tearforge.net";
# 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;
SSH_SERVER_CIPHERS = "chacha20-poly1305@openssh.com,";
SSH_SERVER_KEY_EXCHANGES = "sntrup761x25519-sha512,mlkem768x25519-sha256";
};
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 = true;
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,cry,tearforge";
};
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
mailer = {
ENABLED = false;
SMTP_ADDR = "mail.tearforge.net";
FROM = "noreply@tearforge.net";
USER = "noreply@tearforge.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

@ -0,0 +1,38 @@
{
config,
pkgs,
...
}: {
imports = [
(builtins.fetchTarball {
url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/nixos-25.05/nixos-mailserver-nixos-25.05.tar.gz";
sha256 = "0jpp086m839dz6xh6kw5r8iq0cm4nd691zixzy6z11c4z2vf8v85";
})
];
# simple-nixos-mailserver
# DOCS: https://nixos-mailserver.readthedocs.io/en/latest
mailserver = {
enable = true;
# stateVersion = 3;
# Manually open the firewall instead
openFirewall = false;
virusScanning = false; # expensive memory usage
fqdn = "mail.imbored.dev";
domains = ["imbored.dev"];
# NOTE: generate hashes with `mkpasswd -sm bcrypt`
loginAccounts = {
"me@imbored.dev" = {
aliases = ["emile@imbored.dev"];
hashedPasswordFile = let
CWD = builtins.getEnv "PWD";
# XXX: TODO: use a secrets manager!
in "${CWD}/secrets/passwd/me";
};
};
certificateScheme = "acme-nginx";
};
}

View file

@ -0,0 +1,65 @@
{
pkgs,
upkgs,
...
}: {
services.minecraft-server = {
enable = true;
package = upkgs.minecraft-server; # use latest version only!
declarative = true;
eula = true;
openFirewall = false; # do this manually instead
whitelist = {
"SECRET1" = "";
"SECRET2" = "";
};
# REF: https://minecraft.wiki/w/Server.properties#Java_Edition
serverProperties = {
server-ip = "195.114.14.69"; # listen on all addresses if unset
server-port = 45000; # connection port
"query.port" = 45000; # share game info/advertising information
user-native-transport = true; # Linux packet RX/TX optimizations
# Users Connections
enforce-secure-profile = true;
online-mode = true; # don't allow unlicensed minecraft accounts to join
prevent-proxy-connections = false;
rate-limit = 0;
# Server Functionality
enable-status = true; # where the server appears as "online"
hide-online-players = false;
log-ips = true;
pause-when-empty-seconds = 60; # pause server when no player online for x seconds
view-distance = 10; # range: 3-32
simulation-distance = 10; # range: 3-32
# Players
motd = "M&M's Cozycraft Realm <3";
max-players = 2;
white-list = true;
idle-player-timeout = 0; # never kick idle players
# Gameplay
gamemode = "survival";
force-gamemode = true;
difficulty = "normal";
hardcore = false;
pvp = true;
allow-cheats = true;
# World
level-name = "M&M's Cozycraft"; # world name
# level-seed = "" # random seed if unset
level-type = "minecraft:normal"; # world generation preset
generate-structures = true;
spawn-monsters = true;
spawn-protection = 0;
};
jvmOpts = "-Xms2046M -Xmx2046M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10";
};
}

View file

@ -0,0 +1,57 @@
{pkgs, ...}: {
services.nginx = {
enable = true;
# NOTE: in wake of CVE-2022-3602/CVE-2022-3786 nginxStable is overlayed
package = pkgs.nginx;
# recommendedGzipSettings = 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 {
"dobutterfliescry.net" =
{
default = true;
addSSL = true; # addSSL NOT forceSSL <3
root = "${pkgs.dobutterfliescry-net}/www";
# extraConfig = ''
# error_page 404 /custom_404.html;
# '';
}
// std;
"vault.imbored.dev" =
{
forceSSL = true;
locations."/".proxyPass = "${localhost}:8222";
}
// std;
"tearforge.net" =
{
forceSSL = true;
extraConfig = ''
client_max_body_size 512M;
'';
locations."/".proxyPass = "${localhost}:3000";
}
// std;
};
};
}

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,8 @@
{
pkgs,
inputs,
lib,
...
}: let
home-manager = builtins.fetchTarball {
url = "https://github.com/nix-community/home-manager/archive/release-24.11.tar.gz";
sha256 = "0c07xj74vsj37d3a8f98i9rhhhr99ckwlp45n40f0qkmigm3pk8s";
};
in {
{...}: {
imports = [
./hardware-configuration.nix
(import "${home-manager}/nixos")
#../../flakes/wishlist/wishlist.nix
#../modules/server/nginx.nix
#../modules/server/ssh.nix
#../modules/server/fail2ban.nix
./hardware.nix
];
# override wishlist with the new cool one!
#pkgs.config.packageOverrides = {
# wishlist = inputs.wishlist.packages.x86_64-linux.wishlist;
#};
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"
];
};
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;
# the following line is unnecessary if using an ssh agent
#sshOptions = ["-i /home/me/.ssh/id_hyrule"];
#keys = {
# "imbored.dev" = {
# # text, keyCommand, or keyFile must be set
# # text = "";
# #keyCommand = [ "" ];
# keyFile = "/home/me/.ssh/id_hyrule";
# };
#};
buildOnTarget = false; # build locally then deploy
};
# super duper minimum grub2 config
boot.loader.grub = {
enable = true;
@ -68,419 +11,31 @@ in {
networking = {
hostName = "hyrule";
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [
22 # sshd
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
];
allowedUDPPorts = [
];
};
};
# grant passwordless sudo to wheel group
security.sudo.wheelNeedsPassword = false;
users = {
defaultUserShell = pkgs.bash;
users = {
# primary user
ae = {
users.users = {
cry = {
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"
];
};
foxora = {
isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "docker"];
shell = pkgs.bash;
home = "/home/ae"; # TEMP: remove and replace with home-manager
packages = with pkgs; [
createHome = true;
home = "/home/foxora";
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDSBRYKap1p5lPocRTkguhJN72D2R2CImt5cFYx3Qa7h aurora@nixarawrui"
];
};
subspace = let
# override
wishlistBash =
pkgs.bash.override {
};
in {
isNormalUser = true;
shell = pkgs.bash;
home = "/home/subspace";
packages = with pkgs; [
wishlist
];
};
# user for friends to ssh into
friends = {
isNormalUser = true;
shell = pkgs.bash;
home = "/home/friends"; # TEMP: remove and replace with home-manager
packages = with pkgs; [
];
};
};
};
virtualisation.docker.enable = true;
home-manager = {
users = {
ae = import ../../homes/ae;
subspace = import ../../homes/subspace;
};
sharedModules = [];
};
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;};
#virtualHosts."imbored.dev".locations."/" = {
virtualHosts = {
"imbored.dev" = {
# "http:imbored.dev" = {
default = true;
# serverName = "imbored.dev";
# listenAddresses = ["imbored.dev"];
enableACME = true;
addSSL = true; # forceSSL = true;
root = "/var/www/imbored";
#index = "index.html";
#root = pkgs.writeTextDir "index.html" ''
# <html>
# <body>
# Give me your mittens!
# </body>
# </html>
#'';
};
# "ssh:imbored.dev" = {
# serverName = "imbored.dev";
# listen = [{
# addr = "imbored.dev";
# port= 22;
# }];
# locations."/".proxyPass = "ssh://127.0.0.1:2222";
# };
# Route "vault" subdomain to vaultwarden
"vault.imbored.dev" = {
enableACME = true;
forceSSL = true;
locations."/".proxyPass = "http://127.0.0.1:8222";
};
# Route "forge" subdomain to forgejo
"forge.imbored.dev" = {
# "https:forge.imbored.dev" = {
#serverName = "forge.imbored.dev";
#listenAddresses = ["forge.imbored.dev"]; # NOTE: I think this is wrong
enableACME = true; # TODO: maybe use `forgejo.settings.server.ENABLE_ACME` instead?
forceSSL = true;
extraConfig = ''
client_max_body_size 512M;
'';
locations."/".proxyPass = "http://127.0.0.1:3000";
};
# NOTE: would it work if I used "ssh://forge.imbored.dev" and "https://forge.imbored.dev" instead?
# "ssh:forge.imbored.dev" = {
# serverName = "forge.imbored.dev";
# listen = [{
# addr = "forge.imbored.dev";
# port = 22;
# }];
# locations."/".proxyPass = "ssh://127.0.0.2:22";
# };
};
};
openssh = {
enable = true;
ports = [22];
settings = {
PasswordAuthentication = true;
PermitRootLogin = "no";
AllowUsers = ["ae" "subspace"]; # allow all users by default
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";
SIGNUPS_ALLOWED = false;
};
# 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 = "Emile's Forge";
APP_SLOGIN = "Cozy";
APP_DISPLAY_NAME_FORMAT = "{APP_NAME}: {APP_SLOGAN}";
};
repository = {
DEFAULT_PRIVATE = "private"; # last, private, public
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!";
KEYWORDS = "emileclarkb,git,forge,forgejo,self-hosted";
};
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!!
MIN_PASSWORD_LENGTH = 12;
PASSWORD_COMPLEXITY = "lower,upper,digit,spec";
PASSWORD_CHECK_PWN = true;
};
service = {
# toggle to create an admin user
DISABLE_REGISTRATION = true;
#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;
};
};
};
};
# accept Lets Encrypt's security policy (for nginx)
security.acme = {
acceptTerms = true;
# TODO: change this to me@imbored.dev
defaults.email = "eclarkboman@gmail.com";
};
environment.systemPackages = with pkgs; [
vim
helix
#wishlist
];
programs = {
fish.enable = true;
bash = {
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
'';
};
};
#systemd.services.wishlist = {
# description = "Single entrypoint for multiple SSH endpoints";
# wantedBy = ["multi-user.target"];
#
# serviceConfig = {
# DynamicUser = "yes";
# ExecStart = "${pkgs.wishlist}/bin/wishlist serve --config /home/$USER/.ssh/config";
# Restart = "always";
# RestartSec = "2s";
# };
#};
system.stateVersion = "24.11"; # DO NOT MODIFY
system.stateVersion = "25.11"; # DO NOT MODIFY
}

37
hosts/hyrule/hardware.nix Normal file
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

@ -1,83 +0,0 @@
{
pkgs,
inputs,
lib,
...
}: let
home-manager = builtins.fetchTarball {
url = "https://github.com/nix-community/home-manager/archive/master.tar.gz";
sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj";
};
in {
# TODO:
# - add github:charmbracelet/soft-serve
# - add forgejo
imports = [
../modules/server/nginx.nix
../modules/server/ssh.nix
../modules/server/fail2ban.nix
];
system.stateVersion = "24.05";
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
time.timeZone = "Australia/Brisbane";
i18n.defaultLocale = "en_US.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "us";
};
boot.loader = {
# TODO
};
networking = {
hostName = "imbored";
networkmanager.enable = true;
firewall.allowedTCPPorts = [
22 # sshd
]
};
users = {
defaultUserShell = pkgs.bash;
users = {
# primary user
dev = {
isNormalUser = true;
extraGroups = ["wheel"];
shell = pkgs.bash;
packages = with pkgs; [
];
};
# user for friends to ssh into
friends = {
isNormalUser = true;
shell = pkgs.bash;
packages = with pkgs; [
];
};
};
};
#home-manager = {
# users = {
# dev = import ../../homes/dev;
# friends = import ../../homes/friends;
# };
#};
environment.SystemPackages = with pkgs; [
];
programs = {
};
}

View file

@ -1,297 +1,20 @@
{
pkgs,
inputs,
lib,
...
}: let
home-manager = builtins.fetchTarball {
url = "https://github.com/nix-community/home-manager/archive/release-24.11.tar.gz";
sha256 = "15k41il0mvmwyv6jns4z8k6khhmb22jk5gpcqs1paym3l01g6abn";
};
in {
{...}: {
imports = [
./hardware-configuration.nix
(import "${home-manager}/nixos")
inputs.spicetify-nix.nixosModules.default
./hardware.nix
];
programs.spicetify = let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
in {
enable = true;
enabledExtensions = with spicePkgs.extensions; [
adblock
hidePodcasts
shuffle # shuffle+ (special characters are sanitized out of extension names)
];
#theme = spicePkgs.themes.catppuccin;
#colorScheme = "mocha";
};
boot.loader = {
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot/efi";
};
grub = {
efiSupport = true;
#efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system
device = "nodev";
useOSProber = true;
};
# GitHub: vinceliuice/grub2-themes
grub2-theme = {
enable = true;
theme = "whitesur"; # stylish, vimix, or whitesur
footer = true;
customResolution = "1920x1080"; # Optional: Set a custom resolution
};
};
# Set your time zone.
time.timeZone = "Australia/Brisbane";
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "us";
#packages = with pkgs; [
# nerdfonts
#];
};
# ----- NETWORKING SECTION -----
networking.hostName = "lolcathost";
networking.networkmanager.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
networking.firewall.enable = true;
# ----- SERVICES -----
services = {
# Set display manager (login screen)
displayManager = {
# sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects
sddm = {
enable = true;
wayland.enable = true; # enable experimental sddm support for wayland
theme = "corners";
};
defaultSession = "hyprland";
};
# dbus = {
# # NOTE: programs.uwsm.enable sets implementation to dbus-broker,
# # NOTE: however this seems to break dbus
# implementation = lib.mkForce "dbus";
# };
# Enable sound
#hardware.pulseaudio.enable = false;
pipewire = {
enable = true;
wireplumber.enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
# Enable touchpad support
# Touchpad support
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
# allow wheel group to use passwordless sudo
users = {
# using fish as the login shell tends
# to go very poorly because it isn't
# POSIX compliant, so we'll just use
# simple Bash then :)
defaultUserShell = pkgs.bash;
users = {
# literally me fr (personal account)
me = {
isNormalUser = true;
extraGroups = ["wheel"];
shell = pkgs.bash; #pkgs.fish
packages = with pkgs; [
firefox
nitch
starfetch
# flatpak requires gnome-software
# for graphical applications
flatpak
gnome-software
];
};
# user for my professional jobs and stuff
ae = {
isNormalUser = true;
extraGroups = ["wheel"];
shell = pkgs.bash; #pkgs.fish
packages = with pkgs; [
];
};
# # This is the user account for servers
# dev = {
# isNormalUser = true;
# extraGroups = ["wheel"];
# shell = pkgs.bash; #pkgs.zsh
# packages = with pkgs; [
# ];
# };
# user for friends to ssh into
friends = {
isNormalUser = true;
shell = pkgs.fish;
packages = with pkgs; [
];
};
};
};
home-manager = {
users.me = import ../../homes/me;
sharedModules = [
inputs.nixcord.homeManagerModules.nixcord
inputs.ags.homeManagerModules.default
{nixpkgs.overlays = [inputs.hyprpanel.overlay];}
];
};
# ---- SYSTEM PACKAGES -----
environment.systemPackages = with pkgs; [
# User Environment
inputs.swww.packages.${pkgs.system}.swww
helvum
easyeffects
ani-cli
wl-clipboard # clipboard for wayland
hyprpicker
(callPackage ../sddm-theme-corners.nix {}).sddm-theme-corners
# dependencies for my sddm theme:
pkgs.libsForQt5.qt5.qtgraphicaleffects
python311 # I use 3.11 since it's in a pretty stable state now
poetry # python dependency management and packaging
# fish plugins
grc # colorise command outputs
httpie
curlie
zoxide
doggo
tldr
btop
# Pretty necessary
git
brightnessctl
acpi
vim
# Unix Commands
wget
tree
unzip
];
# Enable the use of certain programs
programs = {
hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
xwayland.enable = true;
};
zsh.enable = true;
fish.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 = {
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
];
};
};
# ----- FONTS -----
fonts = {
enableDefaultPackages = true; # no clue what this line does tbh
packages = with pkgs; [
#(nerdfonts.override {
# fonts = [
# "Cousine"
# "Iosevka"
# "JetBrainsMono"
# ];
# })
nerdfonts
geist-font # for my hyprlock theme
# texlive maintains a noto-emoji flake
texlivePackages.noto-emoji
];
# TODO: change my default fonts
fontconfig = {
defaultFonts = {
serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font
sansSerif = ["Iosevka "];
monospace = ["Cousine"];
emoji = ["Noto Emoji"];
};
};
};
# Enable the new CLI commands and the flakes as experimental features
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# Enable the OpenSSH daemon.
# services.openssh.enable = true;
# Enable OpenGL
hardware = {
graphics.enable = true;
};
# DO NOT MODIFY

26
hosts/matcha/default.nix Normal file
View file

@ -0,0 +1,26 @@
{...}: {
imports = [
./hardware.nix
./state.nix
];
boot.loader = {
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot/efi";
};
grub = {
efiSupport = true;
device = "nodev";
};
};
networking.hostName = "matcha";
users.users.cry = {
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDYwbPjW26fHivB+UpxRArY7nFI09VLAD9xxOiPk/u+YPAOVR8SYTpsHj3L8kI3ENRtt3PRJb97ZfLpPaAJ0LJiZv4qzisDjbfck12FxSDseQlF2JaJZ4wrJ9llcqJbRLKd5wV4KotrDm8Ct2JSBFOdTBQBGJqtNrLOcAtDqVmDPXsWyONINegtcYHumTbJcQU1ksCABdjW5R1dhJesOuMOM8EvrUtDyftvD7sgnBlXTzybP9c1AphUuBMSR5yEz/cDl+iPtQq7tgB+iepCCuNMGQu1wZFPBCMrZtMoxq6gzmZ4oV+W6tfmGEbtdkY+ix+2j960Zngcw7Gj+aYyMY2TyVJuJmIvlzfcrlsbr1TH35Y/5oYhJA+X6aFpgomUsurJ6/QdI1wQ+ceUCnZEeg/8z+WNaq/Bp2hPzT9Y7SPWolpaotDhh9wiuyVqn5VQqwL2lELfvZM4Lu8l6vRPDeMZTemI1nc5jg3aVpJqZTPqFVcCWrWXfdCFwnfy/SdU0JAprCzVvoqkwDHsJwkxY/NcxlNGNha+8oYZgSH1CZhEp3Z7CDJCTDd5PxxCQHs90ENCWFsoGQIV01dAgwD63460En9q2kGr6gO2aRewMD5Vr8AzeGV87vsR3ARpPQVzEWLX08B076Idjwrz8aebdRYBEg7WCxRe5UVI1i/V8j/zQw== emile@deadlyserver.com"
"ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAGEvtRs3C4hjSuvVm2lukqOvObCz5gVlFthcvpGHAqlBgZo47CNJM78WoviEQWceqtu9ZzJdRJ7qEK9ZGvTM0XTSgExkOs6YdS3J7M3i3YS1vcj9KVPinLhiE90aED/319pbYKFrRs/lRzl8XLeaPNqenNMNJBqeary8+r5u9JC6zYCeQ== me@lolcathost"
];
};
}

33
hosts/matcha/hardware.nix Normal file
View file

@ -0,0 +1,33 @@
# 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 + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/d54a5644-744b-4b2a-8c4b-c12836498724";
fsType = "ext4";
};
fileSystems."/boot/efi" =
{ device = "/dev/disk/by-uuid/12CE-A600";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
swapDevices =
[ { device = "/dev/disk/by-uuid/9513ded6-662e-42f7-926e-64d198c2ae7c"; }
];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

20
hosts/matcha/state.nix Normal file
View file

@ -0,0 +1,20 @@
{...}: {
# This option defines the first version of NixOS you have installed on this particular machine,
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
#
# Most users should NEVER change this value after the initial install, for any reason,
# even if you've upgraded your system to a new NixOS release.
#
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
# so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how
# to actually do that.
#
# This value being lower than the current NixOS release does NOT mean your system is
# out of date, out of support, or vulnerable.
#
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
# and migrated your data accordingly.
#
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
system.stateVersion = "25.11"; # Did you read the comment?
}

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

@ -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

@ -0,0 +1,5 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
obsidian
];
}

56
hosts/modules/steam.nix Normal file
View file

@ -0,0 +1,56 @@
{
pkgs,
lib,
...
}: {
# nixpkgs.config.allowUnfreePredicate = pkg:
# builtins.elem (lib.getName pkg) [
# "steam"
# "steam-original"
# "steam-unwrapped"
# "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 = {
steam = {
enable = true;
gamescopeSession.enable = false; # .desktop entry for gamescope
remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true;
localNetworkGameTransfers.openFirewall = true;
extraCompatPackages = with pkgs; [
proton-ge-bin
];
};
gamemode.enable = true;
};
environment.systemPackages = with pkgs; [
steamcmd
mangohud
protonup-qt
# 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
];
}

View file

@ -0,0 +1,34 @@
{
inputs,
pkgs,
system,
...
}: let
# hyprpkgs = inputs.hyprland.packages.${system}
in {
environment.defaultPackages = with pkgs; [
hyprsunset
];
xdg.portal = {
enable = true;
wlr.enable = true;
# extraPortals = with pkgs; [
# xdg-desktop-portal-hyprland
# xdg-desktop-portal-gtk
# ];
};
programs = {
hyprland = {
enable = true;
package = inputs.hyprland.packages.${system}.hyprland;
portalPackage = inputs.hyprland.packages.${system}.xdg-desktop-portal-hyprland;
# withUWSM = true; # Universal Wayland Session Manager
xwayland.enable = true;
};
};
}

View file

@ -1,226 +1,64 @@
{
pkgs,
inputs,
upkgs,
lib,
wishlist,
...
}: let
home-manager = builtins.fetchTarball {
url = "https://github.com/nix-community/home-manager/archive/release-24.11.tar.gz";
sha256 = "1dga3vsd60v9mfyhwgbil13mrchw5crbpgh4zjw9fghv1vyk89vq";
};
in {
}: {
imports = [
./hardware-configuration.nix
(import "${home-manager}/nixos")
inputs.spicetify-nix.nixosModules.default
./hardware.nix
];
programs.spicetify = let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
in {
enable = true;
enabledExtensions = with spicePkgs.extensions; [
adblock
hidePodcasts
shuffle # shuffle+ (special characters are sanitized out of extension names)
networking = {
hostName = "myputer";
firewall = {
allowedTCPPorts = [
22 # SSH
80 # HTTP
443 # HTTPS
5678 # MikroTik WinBox
25565 # Minecraft LAN
];
#theme = spicePkgs.themes.catppuccin;
#colorScheme = "mocha";
};
boot.loader.systemd-boot.enable = false;
boot.loader = {
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot/efi"; #/boot/efi
};
grub = {
efiSupport = true;
#efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system
device = "nodev";
#useOSProber = true;
};
grub2-theme = {
enable = true;
theme = "whitesur"; # stylish, vimix, or whitesur
footer = true;
customResolution = "1920x1080";
};
};
# Set your time zone.
time.timeZone = "Australia/Brisbane";
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "us";
};
# ----- NETWORKING SECTION -----
networking.hostName = "myputer";
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
networking.firewall.enable = true;
# ----- SERVICES -----
services = {
# Set display manager (login screen)
displayManager = {
sddm = {
flatpak.enable = true;
udev = {
enable = true;
wayland.enable = true; # enable experimental sddm support for wayland
theme = "corners";
};
defaultSession = "hyprland";
};
# Enable sound
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
# allow wheel group to use passwordless sudo
security.sudo.wheelNeedsPassword = false;
users = {
# using fish as the login shell tends
# to go very poorly because it isn't
# POSIX compliant, so we'll just use
# simple Bash then :)
defaultUserShell = pkgs.bash;
users = {
# just me fr (personal account)
me = {
isNormalUser = true;
extraGroups = ["wheel" "docker"];
shell = pkgs.bash; #pkgs.fish
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-new = pkgs.callPackage "${colmena-src}/package.nix" {};
in
with pkgs; [
firefox
nitch
starfetch
# flatpak requires gnome-software
flatpak
gnome-software
colmena-new
gitkraken
# NOTE: downloadthing this causes my PC to freak!! ("too many open files" error)
#keyguard # bitwarden client app
];
};
# user for my professional jobs and stuff
ae = {
isNormalUser = true;
extraGroups = ["wheel"];
shell = pkgs.bash; #pkgs.fish
packages = with pkgs; [
via
];
};
# Microdia AK820 (AJAZZ Keeb)
# REF: https://get.vial.today/manual/linux-udev.html
# KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{serial}=="*vial:f64c2b3c*", ATTRS{idVendor}=="0c45", ATTRS{idProduct}=="8009", MODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"
# (AJAZZ Keeb)
# REF: https://get.vial.today/manual/linux-udev.html
# KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{serial}=="*vial:f64c2b3c*", ATTRS{idVendor}=="d010", ATTRS{idProduct}=="1601", MODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"
extraRules = ''
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="d010", ATTRS{idProduct}=="1601", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="d010", ATTRS{idProduct}=="1601", TAG+="uaccess"
'';
};
};
home-manager = {
users.me = import ../../homes/me;
sharedModules = [
inputs.nixcord.homeManagerModules.nixcord
inputs.ags.homeManagerModules.default
{nixpkgs.overlays = [inputs.hyprpanel.overlay];}
];
};
# set 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";
};
security.sudo.wheelNeedsPassword = lib.mkForce false;
# ---- SYSTEM PACKAGES -----
environment.systemPackages = with pkgs; [
# User Environment
inputs.swww.packages.${pkgs.system}.swww
helvum
easyeffects
pavucontrol
ani-cli
wl-clipboard # clipboard for wayland
hyprpicker
libreoffice
via # makes my keek worky :3 [DEBUG]
vial # gui for keeb DEBUG
#(callPackage ../sddm-theme-corners.nix {}).sddm-theme-corners
# dependencies for my sddm theme:
pkgs.libsForQt5.qt5.qtgraphicaleffects
python311 # I use 3.11 since it's in a pretty stable state now
poetry # python dependency management and packaging
nixd # lsp for nix
neofetch # TODO: remove (installed to debug something)
# fish plugins
grc # colorise command outputs
httpie
curlie
zoxide
doggo
tldr
#btop
tesseract # for my work with Agribit
# TODO: remove this and host my nix flake on github instead
#wishlist
# Pretty necessary
git
brightnessctl
acpi
vim
nix-prefetch-git
# Unix Commands
wget
tree
unzip
# Cryptography
openssl
libargon2
# Games
prismlauncher # minecraft
upkgs.olympus # CELESTE!! <3 :3
discord
];
# DEBUG: configuring xdg portal here instead?
@ -239,121 +77,6 @@ in {
# ];
#};
# Enable the use of certain programs
programs = {
hyprland = {
enable = true;
# TODO: uncomment, I did this when hyprland wasn't working
#package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
#portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
xwayland.enable = true;
};
zsh.enable = true;
fish.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 = {
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 users: `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 already i guess
"Iosevka" # nah nah
"IosevkaTerm" # big nah
"CascadiaCode" # potential
"FiraCode" # potential
"JetBrainsMono" # for my rofi theme
"Hasklig"
"Hack"
];
})
*/
nerdfonts
geist-font # for my hyprlock theme
# texlive maintains a noto-emoji flake
texlivePackages.noto-emoji
];
# TODO: change my default fonts
fontconfig = {
defaultFonts = {
serif = ["Iosevka"];
sansSerif = ["Iosevka "];
monospace = ["Cousine"];
emoji = ["Noto Emoji"];
};
};
};
# Enable the new CLI commands and the flakes as experimental features
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
virtualisation.docker.enable = true;
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
#programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
#};
# Enable the OpenSSH daemon.
# services.openssh.enable = true;
# Enable OpenGL
hardware = {
graphics.enable = true;
};
# DO NOT MODIFY
system.stateVersion = "24.05"; # Did you read the comment?
}

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