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
1
.gitignore
vendored
Executable file → Normal file
|
|
@ -2,3 +2,4 @@ ISSUES/
|
|||
secrets/
|
||||
|
||||
result
|
||||
rebuild*.log
|
||||
|
|
|
|||
7
.sops.yaml
Normal file
7
.sops.yaml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
keys:
|
||||
- &cry age1e5e32alqa20cf40wt9jq8aaa2x3gh32207xj6ea5veszlpxnzgjqd2htm7
|
||||
creation_rules:
|
||||
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
|
||||
key_groups:
|
||||
- age:
|
||||
- *cry
|
||||
25
DEVDOC.md
25
DEVDOC.md
|
|
@ -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)
|
||||
3
DEV_ENV
3
DEV_ENV
|
|
@ -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`
|
||||
|
|
@ -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
77
README.md
Executable file → Normal 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
91
TODO
|
|
@ -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
9
TODO.md
Normal 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
|
||||
3
TODO_UI
3
TODO_UI
|
|
@ -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
20
colors.rasi
Normal 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
58
deploy
|
|
@ -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
|
||||
|
|
@ -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
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
189
flake.nix
Executable file → Normal 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 ./.;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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";
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
@ -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
67
groups/all/default.nix
Normal 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
|
||||
];
|
||||
}
|
||||
12
groups/all/modules/flatpak.nix
Normal file
12
groups/all/modules/flatpak.nix
Normal 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
121
groups/cryde/default.nix
Normal 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
33
groups/cryde/programs.nix
Normal 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
120
groups/cryos/default.nix
Normal 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
124
groups/cryos/programs.nix
Normal 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
85
groups/server/default.nix
Normal 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
|
||||
];
|
||||
}
|
||||
|
|
@ -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
21
homes/cry/default.nix
Normal 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
|
||||
}
|
||||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
})
|
||||
|
||||
|
|
|
|||
250
homes/modules/apps/nixcord.nix
Normal file
250
homes/modules/apps/nixcord.nix
Normal 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"
|
||||
# ];
|
||||
# }
|
||||
# ];
|
||||
# };
|
||||
};
|
||||
}
|
||||
10
homes/modules/apps/thunderbird.nix
Normal file
10
homes/modules/apps/thunderbird.nix
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{...}: {
|
||||
programs.thunderbird = {
|
||||
enable = true;
|
||||
profiles = {
|
||||
"me" = {
|
||||
isDefault = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -12,4 +12,13 @@
|
|||
theme = "Dracula";
|
||||
};
|
||||
};
|
||||
|
||||
# other commands that make normal utils prettier
|
||||
home.packages = with pkgs.bat-extras; [
|
||||
batdiff
|
||||
batgrep
|
||||
batman
|
||||
batwatch
|
||||
prettybat
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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}";});
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
247
homes/modules/editor/neovim/default.nix
Normal file
247
homes/modules/editor/neovim/default.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
9
homes/modules/editor/neovim/init.lua
Normal file
9
homes/modules/editor/neovim/init.lua
Normal 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")
|
||||
66
homes/modules/editor/neovim/lua/lsp/capabilities.lua
Normal file
66
homes/modules/editor/neovim/lua/lsp/capabilities.lua
Normal 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
|
||||
103
homes/modules/editor/neovim/lua/lsp/completion.lua
Normal file
103
homes/modules/editor/neovim/lua/lsp/completion.lua
Normal 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,
|
||||
},
|
||||
}
|
||||
20
homes/modules/editor/neovim/lua/lsp/indentation.lua
Normal file
20
homes/modules/editor/neovim/lua/lsp/indentation.lua
Normal 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,
|
||||
})
|
||||
6
homes/modules/editor/neovim/lua/lsp/init.lua
Normal file
6
homes/modules/editor/neovim/lua/lsp/init.lua
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
require("lze").load({
|
||||
{ import = "lsp.completion" },
|
||||
})
|
||||
|
||||
require("lsp.indentation")
|
||||
require("lsp.lsp")
|
||||
134
homes/modules/editor/neovim/lua/lsp/lsp.lua
Normal file
134
homes/modules/editor/neovim/lua/lsp/lsp.lua
Normal 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,
|
||||
},
|
||||
})
|
||||
23
homes/modules/editor/neovim/lua/plugins/comment.lua
Normal file
23
homes/modules/editor/neovim/lua/plugins/comment.lua
Normal 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,
|
||||
},
|
||||
}
|
||||
5
homes/modules/editor/neovim/lua/plugins/dressing.lua
Normal file
5
homes/modules/editor/neovim/lua/plugins/dressing.lua
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
return {
|
||||
{
|
||||
"dressing.nvim",
|
||||
},
|
||||
}
|
||||
34
homes/modules/editor/neovim/lua/plugins/format.lua
Normal file
34
homes/modules/editor/neovim/lua/plugins/format.lua
Normal 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,
|
||||
},
|
||||
}
|
||||
22
homes/modules/editor/neovim/lua/plugins/fyler.lua
Normal file
22
homes/modules/editor/neovim/lua/plugins/fyler.lua
Normal 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,
|
||||
},
|
||||
}
|
||||
9
homes/modules/editor/neovim/lua/plugins/init.lua
Normal file
9
homes/modules/editor/neovim/lua/plugins/init.lua
Normal 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" },
|
||||
})
|
||||
76
homes/modules/editor/neovim/lua/plugins/mini-hipatterns.lua
Normal file
76
homes/modules/editor/neovim/lua/plugins/mini-hipatterns.lua
Normal 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,
|
||||
},
|
||||
}
|
||||
78
homes/modules/editor/neovim/lua/plugins/telescope.lua
Normal file
78
homes/modules/editor/neovim/lua/plugins/telescope.lua
Normal 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,
|
||||
},
|
||||
}
|
||||
95
homes/modules/editor/neovim/lua/plugins/treesitter.lua
Normal file
95
homes/modules/editor/neovim/lua/plugins/treesitter.lua
Normal 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,
|
||||
},
|
||||
}
|
||||
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
134
homes/modules/editor/vscode.nix
Normal file
134
homes/modules/editor/vscode.nix
Normal 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 = ...;
|
||||
};
|
||||
}
|
||||
37
homes/modules/editor/vscodium.nix
Normal file
37
homes/modules/editor/vscodium.nix
Normal 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";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -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 @@
|
|||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
54
homes/modules/mako.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -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
16
homes/modules/obs.nix
Executable 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
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -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";
|
||||
};
|
||||
}
|
||||
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
9
homes/modules/term/default.nix
Normal file
9
homes/modules/term/default.nix
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
options = {
|
||||
|
||||
}
|
||||
}
|
||||
328
homes/modules/term/foot.nix
Normal file
328
homes/modules/term/foot.nix
Normal 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";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
45
homes/modules/term/ghostty.nix
Normal file
45
homes/modules/term/ghostty.nix
Normal 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";});
|
||||
#};
|
||||
};
|
||||
}
|
||||
|
|
@ -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
5
homes/modules/tmux.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{...}: {
|
||||
programs.tmux = {
|
||||
enable = true;
|
||||
};
|
||||
}
|
||||
39
homes/modules/wm/default.nix
Normal file
39
homes/modules/wm/default.nix
Normal 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
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
29
homes/modules/wm/hypr/hyprland.nix
Executable file
29
homes/modules/wm/hypr/hyprland.nix
Executable 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
|
||||
# ];
|
||||
};
|
||||
};
|
||||
}
|
||||
107
homes/modules/wm/mangowc.nix
Normal file
107
homes/modules/wm/mangowc.nix
Normal 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
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
@ -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
91
hosts/butterfly/default.nix
Executable 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
|
||||
}
|
||||
7
hosts/butterfly/services/default.nix
Normal file
7
hosts/butterfly/services/default.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{...}: {
|
||||
imports = [
|
||||
./nginx.nix
|
||||
./forgejo.nix
|
||||
./vaultwarden.nix
|
||||
];
|
||||
}
|
||||
181
hosts/butterfly/services/forgejo.nix
Normal file
181
hosts/butterfly/services/forgejo.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
38
hosts/butterfly/services/mailserver.nix
Normal file
38
hosts/butterfly/services/mailserver.nix
Normal 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";
|
||||
};
|
||||
}
|
||||
65
hosts/butterfly/services/minecraft-server.nix
Normal file
65
hosts/butterfly/services/minecraft-server.nix
Normal 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";
|
||||
};
|
||||
}
|
||||
57
hosts/butterfly/services/nginx.nix
Normal file
57
hosts/butterfly/services/nginx.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
}
|
||||
25
hosts/butterfly/services/vaultwarden.nix
Normal file
25
hosts/butterfly/services/vaultwarden.nix
Normal 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";
|
||||
};
|
||||
}
|
||||
|
|
@ -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
37
hosts/hyrule/hardware.nix
Normal 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";
|
||||
}
|
||||
|
|
@ -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 = {
|
||||
};
|
||||
}
|
||||
|
|
@ -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
26
hosts/matcha/default.nix
Normal 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
33
hosts/matcha/hardware.nix
Normal 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
20
hosts/matcha/state.nix
Normal 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?
|
||||
}
|
||||
25
hosts/modules/apps/rider.nix
Normal file
25
hosts/modules/apps/rider.nix
Normal 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
|
||||
];
|
||||
};
|
||||
}
|
||||
6
hosts/modules/apps/winbox.nix
Normal file
6
hosts/modules/apps/winbox.nix
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{...}: {
|
||||
programs.winbox = {
|
||||
enable = true;
|
||||
openFirewall = false; # port: 5678
|
||||
};
|
||||
}
|
||||
27
hosts/modules/bashistrans.nix
Normal file
27
hosts/modules/bashistrans.nix
Normal 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
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
61
hosts/modules/langs/dotnet.nix
Normal file
61
hosts/modules/langs/dotnet.nix
Normal 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
|
||||
];
|
||||
}
|
||||
5
hosts/modules/obsidian.nix
Normal file
5
hosts/modules/obsidian.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{pkgs, ...}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
obsidian
|
||||
];
|
||||
}
|
||||
56
hosts/modules/steam.nix
Normal file
56
hosts/modules/steam.nix
Normal 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
|
||||
];
|
||||
}
|
||||
34
hosts/modules/wm/hyprland.nix
Normal file
34
hosts/modules/wm/hyprland.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue