71 Commits
2411 ... main

Author SHA1 Message Date
34f84a18b3 needed new stuff 2025-09-28 22:54:21 +02:00
ac36f0adf2 jupyter qbit 2025-09-28 22:54:21 +02:00
e50397c2e3 add jupyter to routers 2025-09-24 11:56:16 +02:00
4634d35eb2 moved miniflux 2025-09-24 09:34:30 +02:00
c5d4cac1a0 update ollama models 2025-09-14 22:58:48 +02:00
a172fe7ff7 owui update 2025-09-14 22:45:24 +02:00
4c65e43fd1 just my builders 2025-09-10 14:03:40 +02:00
f5d8296ff0 ollama 2025-09-10 13:39:02 +02:00
07455cb132 elrond 2025-09-10 13:38:10 +02:00
df5eee8d84 elrond ollama webui 2025-06-23 22:09:15 +02:00
Adrian G L
6614903852 cleanup README.md 2025-06-03 15:23:10 +02:00
Adrian G L
fdafcea4f7 Update README.md 2025-06-03 15:07:23 +02:00
84734df417 small changes 2025-05-29 10:11:23 +02:00
9627cd0786 feat: add floating window rule for onboard app-id in niri.nix configuration 2025-05-29 00:35:04 +02:00
b6468bd29e feat: add on-screen keyboard button to waybar's left modules 2025-05-29 00:31:49 +02:00
2a04bb07b0 style: increase tray spacing from 8 to 12 in waybar config 2025-05-29 00:31:48 +02:00
4871559257 foot niri updates 2025-05-26 16:28:43 +02:00
d8dbcce967 fix: use 0x prefix for colors in foot.nix to fix RGB format errors 2025-05-26 14:38:29 +02:00
c5dbbfb933 fix: move trayAllOutputs to JSON config and add tray-position for Waybar tray 2025-05-26 11:07:20 +02:00
771ea038ec fix: escape newline in power-profiles-daemon tooltip and remove unused format-alt-click 2025-05-26 11:05:59 +02:00
c1a21e9a4d feat: set waybar package to waybarFull and enable tray on all outputs 2025-05-26 10:57:24 +02:00
b1e26c04b7 style: increase opacity and add hover effect for niri-workspaces in waybar styles 2025-05-26 10:56:04 +02:00
2e1c26ef7a styling kinda done now 2025-05-25 22:50:42 +02:00
50a3e26386 style: increase fuzzel font size, icon size, move window up, and soften highlight color 2025-05-25 22:00:03 +02:00
28ab87f588 style: add missing spaces after commas in modules-right list in waybar config 2025-05-25 21:55:35 +02:00
a554be2df5 style: restore waybar layout and add active highlight styling for niri workspaces 2025-05-25 21:53:31 +02:00
338a39d0be fix: correct color opacity values in swaylock and waybar configurations 2025-05-25 21:51:49 +02:00
582886dcb1 refactor: apply b16 color scheme and update swaylock config options 2025-05-25 21:51:00 +02:00
7aa354b6b4 style: darken waybar and increase contrast, reduce swaylock brightness and enhance ring color 2025-05-25 21:47:47 +02:00
54da358d5e fix: restore opacity contrast in waybar, correct swaylock colors, and fix wlogout icon styling 2025-05-25 21:44:46 +02:00
394ab8e87b fix: quote color codes in wlogout.nix CSS properties for consistency 2025-05-25 21:40:57 +02:00
7feda0326a fix: add missing quotes to color values in swaylock configuration 2025-05-25 21:40:28 +02:00
b3719addd6 fix: prepend '#' to color codes in foot.nix for correct formatting 2025-05-25 21:39:53 +02:00
f2799ccb5b fix: update workspace button color opacity to 1 in waybar.nix 2025-05-25 21:39:14 +02:00
24d3b16b83 style: update waybar colors to better match Base16 palette slots 2025-05-25 21:39:07 +02:00
8ba2a0cc4f refactor: update config colors to use palette variables instead of hex codes 2025-05-25 21:36:35 +02:00
c7f1dff97c feat: update colors.nix with unified darkmode teal-green Base16 palette 2025-05-25 21:34:29 +02:00
306eb316e5 fix: correct custom overview module name in waybar configuration 2025-05-25 21:20:31 +02:00
5fcd9c93b2 refactor: simplify window rules for Bitwarden floating behavior 2025-05-25 21:18:44 +02:00
598a7f2b45 fix: prefix color codes with '#' in mako config to fix parsing errors 2025-05-25 14:36:48 +02:00
f9192a65c4 25.05 ish 2025-05-25 12:31:52 +02:00
827d659160 feat: add gnome-themes-extra package to colors.nix for GTK theme support 2025-05-25 11:52:09 +02:00
c9db00532e style: remove redundant line in colors.nix theme package assignment 2025-05-25 11:52:07 +02:00
0755352a2e refactor: switch network status update to click-based cycling and remove polling interval 2025-05-25 11:18:50 +02:00
49bdc108e7 fix: correct color codes in markup and add wifi/ethernet glyphs to network formats 2025-05-25 11:17:05 +02:00
114648a9d2 style: remove redundant network tooltip styling in waybar config 2025-05-25 11:17:03 +02:00
10aed5245b fix: replace invalid 'max-width' with 'width' in GTK CSS tooltip style 2025-05-25 11:09:54 +02:00
a111590e39 fix: remove malformed comment block causing CSS parse error in waybar config 2025-05-25 11:08:12 +02:00
1b9e2a6b75 fix: remove invalid comment from JSON in waybar.nix to fix parse error 2025-05-25 11:05:23 +02:00
6efd73e6aa feat: add custom launcher and enhance network and clock modules with tooltips and styling 2025-05-25 11:05:22 +02:00
4e365a5e5c feat: add rounded corners, center window, and enlarge icons in config 2025-05-25 11:02:13 +02:00
cd7df6f38b style: apply b16 colorscheme to fuzzel configuration 2025-05-25 11:01:12 +02:00
b8fad8d4b4 feat: add fuzzel config and import it in niri.nix 2025-05-25 10:59:54 +02:00
a11050f6e5 refactor: update niri config for window proportions, bindings, and cleanup fonts 2025-05-25 10:59:53 +02:00
957facbd5d fix: import 0xproto font from pkgs.nerd-fonts in fonts.nix configuration 2025-05-24 23:59:18 +02:00
9a58df54ff fix: add 0xproto back to monospace default fonts list 2025-05-24 23:58:32 +02:00
eaa7e26cdc fix: remove missing 0xproto font from monospace fontconfig list 2025-05-24 23:57:01 +02:00
0a63318ddc feat: add common font configuration and packages for home environment 2025-05-24 23:57:00 +02:00
cc72effdce fix: Remove nixpkgs config and update kate alias in configurations 2025-05-24 03:30:24 +02:00
6e96f4749f fix: Update renamed options in mako, vscode, and pulseaudio configurations 2025-05-24 03:28:51 +02:00
c15d8f03c9 fix: Reduce default timeout from 5000ms to 3000ms in configuration 2025-05-24 03:28:50 +02:00
829275d044 aragon ollama niri 2025-05-21 13:06:58 +02:00
a0831e42e1 niri 2025-05-20 08:03:51 +02:00
fc7e4d6668 ollama aragon 2025-05-19 15:44:40 +02:00
2a15e0e7c2 removed flake agian 2025-05-16 12:06:42 +02:00
bfb5ea11be sway updates 2025-05-06 15:23:28 +02:00
80da6b5a81 updated to use homemanger added atuin 2025-05-06 00:38:40 +02:00
d3e00168b5 removed kanidm 2025-05-02 12:07:03 +02:00
2281cf9111 cuda unfree 2025-02-28 12:56:21 +01:00
2063655b6c cleanup 2025-02-14 20:21:34 +01:00
Adrian G L
610cf5273d Merge pull request #4 from adrlau/2411
2411
2025-02-13 14:04:07 +01:00
75 changed files with 2709 additions and 943 deletions

2
.gitignore vendored
View File

@@ -3,3 +3,5 @@
./secrets/secrets.yaml.priv
./secrets/secrets.priv.yaml.gpg
.aider*
.env

View File

@@ -1,20 +1,87 @@
# nix-dotfiles
My nix dotfiles. Will not guarrante it to work as it is always a work in progress.
# NixOS Configuration Repository
**Work-in-progress setup**
## Repository Structure
This repository contains my NixOS configuration files organized into several directories:
* `home/`: Home manager
* `machines/`: Machine-specific configurations
* `packages/`: Custom package definitions and configs.
* `profiles/`: System profiles (desktop, development, etc.)
* `services/`: Service configurations (nginx, mysql, etc.)
* `secrets/`: Encrypted secrets
## Quick Start
### Build Configuration
```bash
nix --extra-experimental-features "nix-command flakes" build ".#nixosConfigurations.galadriel.config.system.build.toplevel"
```
nixos-rebuild switch --update-input nixpkgs --update-input unstable --no-write-lock-file --refresh --flake git+https://github.com/adrlau/nix-dotfiles.git --upgrade
### Rebuild and Switch
The primary rebuild command is:
```bash
sudo nixos-rebuild switch --flake .# --no-write-lock-file -L --impure
```
This command:
* Uses the current flake
* Disables lock file writing
* Enables debug logging (-L)
* Allows impure derivations
#### Alternative Rebuild Methods
1. **Remote Flake**:
```bash
sudo nixos-rebuild switch \
--update-input nixpkgs \
--update-input unstable \
--no-write-lock-file \
--refresh \
--flake git+https://github.com/adrlau/nix-dotfiles.git \
--upgrade
```
2. **Standard Local Rebuild**:
```bash
sudo nixos-rebuild switch --flake .#
```
## Dependency Inspection
Check package relationships using:
```bash
nix why-depends /run/current-system /nix/store/...
nix why-depends .#nixosConfigurations.galadriel nixpkgs#python312Packages.botorch
nix why-depends .#nixosConfigurations.eowyn.config.system.build.toplevel pkgs.python3.12-libarcus-4.12.0 --impure
```
show flake attrs
```nix flake show .#```
## Troubleshooting
### Fix Broken Store
After aborted rebuilds:
```bash
nix-store --query --referrers-closure \
$(find /nix/store -maxdepth 1 -type f -name '*.drv' -size 0) |
xargs sudo nix-store --delete --ignore-liveness
sudo nix store gc
sudo nix store verify --repair --all
```
why depends:
```nix why-depends /run/current-system /nix/store/...```
```nix why-depends .#```
```nix why-depends .#nixosConfigurations.galadriel nixpkgs#python312Packages.botorch```
```nix why-depends .\#nixosConfigurations.eowyn.config.system.build.toplevel pkgs.python3.12-libarcus-4.12.0 --impure```
### Viewing Logs
Check home-manager logs:
```bash
journalctl -eu home-manager-gunalx
```
## Maintenance
Clean old generations:
```bash
sudo nix-collect-garbage --delete-older-than 4d
```
## Notes
* This configuration is constantly evolving
* Refer to specific machine configurations in `machines/` for details
* Service configurations are located in `services/`
* Custom packages are defined in `packages/`

View File

@@ -2,10 +2,10 @@
description = "My System flake";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager/release-24.11";
home-manager.url = "github:nix-community/home-manager/release-25.05";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
nix-colors.url = "github:misterio77/nix-colors";
@@ -49,9 +49,8 @@
, unstable
, ... }@inputs:
let
overlay-unstable = final: prev: {
unstable = unstable.legacyPackages.${prev.system};
};
overlay-unstable = final: prev: { unstable = inputs.unstable.legacyPackages.${prev.system}; };
overlays = [ overlay-unstable ];
in
{
nixosConfigurations = {
@@ -91,6 +90,14 @@
({ config, pkgs, ... }: { nixpkgs.overlays = [ overlay-unstable ]; })
./machines/aragon/configuration.nix
sops-nix.nixosModules.sops
home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users."gunalx" = import ./home/gunalx/full.nix;
home-manager.users."root" = import ./home/root/base.nix;
home-manager.backupFileExtension = "bac";
home-manager.extraSpecialArgs = {inherit nix-colors inputs;};
}
];
};
@@ -105,6 +112,17 @@
({ config, pkgs, ... }: { nixpkgs.overlays = [ overlay-unstable ]; })
./machines/galadriel/configuration.nix
sops-nix.nixosModules.sops
home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users."gunalx" = import ./home/gunalx/base.nix;
home-manager.users."root" = import ./home/root/base.nix;
home-manager.backupFileExtension = "bac";
home-manager.extraSpecialArgs = {inherit nix-colors inputs;};
}
ozai.nixosModules.ozai
ozai-webui.nixosModules.ozai-webui
@@ -133,8 +151,8 @@
./machines/elrond/configuration.nix
({ config, pkgs, ... }: { nixpkgs.overlays = [ overlay-unstable ]; })
sops-nix.nixosModules.sops
inputs.ozai.nixosModules.ozai
inputs.ozai-webui.nixosModules.ozai-webui
#inputs.ozai.nixosModules.ozai
#inputs.ozai-webui.nixosModules.ozai-webui
];
};
};

54
home/common/atuin.nix Normal file
View File

@@ -0,0 +1,54 @@
{ pkgs, ... }:
{
programs.atuin = {
enable = true;
settings = {
# Data files
db_path = "~/.history.db";
# Filtering
filter_mode = "host";
filter_mode_shell_up_key_binding = "directory";
# UI
max_preview_height = 2;
show_help = true;
prefers_reduced_motion = true;
# History storage
secrets_filter = true;
enter_accept = true;
# Sync v2
sync = {
records = true;
};
# Stats
stats = {
common_subcommands = [
"apt" "cargo" "composer" "dnf" "docker" "git" "go" "ip"
"kubectl" "nix" "nmcli" "npm" "pecl" "pnpm" "podman"
"port" "systemctl" "tmux" "yarn"
];
common_prefix = [ "sudo" ];
};
# Keys
keys = {
scroll_exits = true;
};
# Theme
theme = {
name = "marine";
};
# Search
search = {
filters = [ "directory" "host" "session" ];
};
};
};
}

View File

@@ -1,23 +1,28 @@
{ pkgs, lib, ... }:
{
home.packages = with pkgs; [
nerdfonts
home.packages = with pkgs; [
nerd-fonts._0xproto
_0xproto
noto-fonts
noto-fonts-cjk
noto-fonts-cjk-sans
noto-fonts-emoji
noto-fonts-color-emoji
noto-fonts-emoji-blob-bin
unicode-emoji
liberation_ttf
fira-code
fira-code-symbols
nerdfonts
ubuntu_font_family
zpix-pixel-font
_0xproto
font-awesome
font-awesome_5
font-awesome_4
nerd-fonts._0xproto
]++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts);
];
fonts.fontconfig.enable = true;
fonts.fontconfig.defaultFonts = {

View File

@@ -3,4 +3,6 @@
imports = [
];
nixpkgs.config.allowUnfree = true;
}
programs.nix-index.enable = true;
}

View File

@@ -5,6 +5,7 @@
home.packages = with pkgs; [
openssh
ssh-askpass-fullscreen
sshfs
];
@@ -16,20 +17,23 @@
matchBlocks = {
"*" = {
identityFile = [
"~/.ssh/nixos"
"~/.ssh/id_ed25519"
];
};
"*.pvv.ntnu.no" = {
user="adriangl";
};
"*.ntnu.no !login.pvv.ntnu.no" = {
user="adriangl";
proxyJump="login.pvv.ntnu.no";
};
"snotra" = {
user="adriangl";
proxyJump="adriangl@login.pvv.ntnu.no";
@@ -49,6 +53,10 @@
"bolle.pbsds.net" = {
user="adrlau";
proxyJump = "login.pvv.ntnu.no";
extraOptions = {
StrictHostKeyChecking = "no";
UserKnownHostsFile = "/dev/null";
};
};
#pvv
@@ -64,30 +72,25 @@
#home
"aragon" = {
port = 6969;
user="gunalx";
hostname="100.74.34.149";
};
"galadriel" = {
port = 6969;
user="gunalx";
hostname="100.84.215.84";
};
"gandalf" = {
port = 6969;
user="gunalx";
hostname="100.124.183.16";
};
"elrond" = {
port = 6969;
user="gunalx";
hostname="100.101.17.39 ";
};
};
extraConfig = "";

View File

@@ -1,23 +0,0 @@
{ lib, stdenv, pkgs }:
stdenv.mkDerivation rec {
pname = "wallpapers";
version = "1.0";
src = pkgs.fetchurl {
url = "file://./";
sha256 = lib.fakeSha256;
};
installPhase = ''
mkdir -p $out/share/wallpapers
cp -r * $out/share/wallpapers/
'';
meta = with lib; {
description = "My Collection of wallpapers";
license = licenses.unfree;
maintainers = with maintainers; [ adriangl ];
};
}

View File

@@ -2,25 +2,21 @@
{
imports = [
../common/sshconfig.nix
../common/unfree.nix
../common/nix.nix
../common/atuin.nix
];
programs.nix-index = {
enableBashIntegration = true;
enable = true;
};
nixpkgs = {
config = {
allowUnfree = true;
allowUnfreePredicate = (_: true);
};
};
programs.bash = {
enable = true;
shellAliases = {
"rebuild" = "sudo nixos-rebuild switch --update-input nixpkgs --update-input unstable --no-write-lock-file --refresh --flake git+https://github.com/adrlau/nix-dotfiles.git --upgrade";
"nixedit" = "vim /etc/nixos/nix-dotfiles/.";
"rebuild" = "sudo nixos-rebuild switch --no-write-lock-file --flake git+https://github.com/adrlau/nix-dotfiles.git -L --impure";
"nixedit" = "sudo vim /etc/nixos/nix-dotfiles/.";
"nixdir" = "cd /etc/nixos/nix-dotfiles";

View File

@@ -2,12 +2,12 @@
programs.vscode = {
enable = true;
enableUpdateCheck = false;
enableExtensionUpdateCheck = false;
profiles.default.enableUpdateCheck = false;
profiles.default.enableExtensionUpdateCheck = false;
mutableExtensionsDir = true;
# Extensions
extensions = (with pkgs.vscode-extensions; [
profiles.default.extensions = (with pkgs.vscode-extensions; [
# Stable
ms-vscode-remote.remote-ssh
mhutchie.git-graph
@@ -39,7 +39,7 @@
]);
# Settings
userSettings = {
profiles.default.userSettings = {
# General
"editor.fontSize" = 16;
"editor.fontFamily" = "'Jetbrains Mono', 'monospace', monospace";

View File

@@ -32,27 +32,27 @@ in{
# variant = "dark";
# };
colorScheme = {
slug = "cyberpunk-apathy";
name = "Cyberpunk Apathy";
author = "Adrian G L (based on Apathy by Jannik Siebert)";
slug = "teal-green-dark";
name = "Teal Green Dark";
author = "Autogenerated";
palette = {
# Base16 color values with context-specific usage comments
base00 = background; # Default background
base01 = darkTeal; # Lighter background (used for status bars)
base02 = lighterTeal; # Selection background
base03 = teal; # Comments, secondary content, line highlighting
base04 = lightTeal; # Darker foreground (used for status bars)
base05 = foreground; # Default text and foreground
base06 = lightGrey; # Lighter foreground (used for inactive text)
base07 = offWhite; # Lightest background (used for highlights)
base08 = teal; # Variables, constants, markup link text
base09 = blue; # Integers, booleans, constants, and XML attributes
base0A = magenta; # Classes, headings, keywords
base0B = cyan; # Strings, literals, escape sequences
base0C = green; # Support and error colors
base0D = cyan; # Functions, methods, function names
base0E = red; # Keywords, storage, selectors
base0F = yellow; # Deprecated or obsolete code
# Base16 TealGreen Dark Theme
base00 = "0f1f1c"; # Default background
base01 = "143028"; # Lighter background (status bars)
base02 = "1e3b34"; # Selection background
base03 = "28514b"; # Comments, secondary content
base04 = "4a7b70"; # Dark foreground (status bars)
base05 = "d4efe0"; # Default foreground
base06 = "e4f8f2"; # Light foreground
base07 = "fafdfb"; # Lightest background
base08 = "63d1be"; # Variables, markup link text
base09 = "3dc28f"; # Integers, constants
base0A = "a2e096"; # Classes, search highlight
base0B = "8ce45a"; # Strings, inserted
base0C = "4cd7e5"; # Support, escape characters
base0D = "2e97d5"; # Functions, headings
base0E = "df6fad"; # Keywords, selectors
base0F = "e5d97f"; # Deprecated tags
};
};
@@ -62,7 +62,7 @@ in{
enable = true;
theme = {
name = "Adwaita-dark";
package = pkgs.gnome.gnome-themes-extra;
package = pkgs.gnome-themes-extra;
};
};
@@ -72,5 +72,10 @@ in{
style.name = "adwaita-dark";
};
# Ensure the Adwaita GTK theme is installed so wlogout can load gtk.css
home.packages = with pkgs; [
gnome-themes-extra
];
}

642
home/gunalx/config.kdl Normal file
View File

@@ -0,0 +1,642 @@
// This config is in the KDL format: https://kdl.dev
// "/-" comments out the following node.
// Check the wiki for a full description of the configuration:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview
// Input device configuration.
// Find the full list of options on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
input {
keyboard {
xkb {
// You can set rules, model, layout, variant and options.
// For more information, see xkeyboard-config(7).
// For example:
layout "us,no"
//options "grp:win_space_toggle,compose:ralt,ctrl:nocaps"
options "grp:ctrl_space_toggle"
}
}
// Next sections include libinput settings.
// Omitting settings disables them, or leaves them at their default values.
touchpad {
// off
tap
// dwt
// dwtp
// drag-lock
natural-scroll
accel-speed 0.1
accel-profile "flat"
// scroll-method "two-finger"
// disabled-on-external-mouse
}
mouse {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "no-scroll"
}
trackpoint {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "on-button-down"
// scroll-button 273
// middle-emulation
}
// Uncomment this to make the mouse warp to the center of newly focused windows.
warp-mouse-to-focus
// Focus windows and outputs automatically when moving the mouse into them.
// Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
focus-follows-mouse max-scroll-amount="0%"
}
// You can configure outputs by their name, which you can find
// by running `niri msg outputs` while inside a niri instance.
// The built-in laptop monitor is usually called "eDP-1".
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs
// Remember to uncomment the node by removing "/-"!
output "AU Optronics 0x212B Unknown" {
// Uncomment this line to disable this output.
// off
// Resolution and, optionally, refresh rate of the output.
// The format is "<width>x<height>" or "<width>x<height>@<refresh rate>".
// If the refresh rate is omitted, niri will pick the highest refresh rate
// for the resolution.
// If the mode is omitted altogether or is invalid, niri will pick one automatically.
// Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
mode "3840x2160@60.002"
// You can use integer or fractional scale, for example use 1.5 for 150% scale.
scale 2
// Transform allows to rotate the output counter-clockwise, valid values are:
// normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
transform "normal"
// Position of the output in the global coordinate space.
// This affects directional monitor actions like "focus-monitor-left", and cursor movement.
// The cursor can only move between directly adjacent outputs.
// Output scale and rotation has to be taken into account for positioning:
// outputs are sized in logical, or scaled, pixels.
// For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,
// so to put another output directly adjacent to it on the right, set its x to 1920.
// If the position is unset or results in an overlap, the output is instead placed
// automatically.
position x=1920 y=2160
}
output "ASUSTek COMPUTER INC ASUS MB16AH L9LMTF068515" { //MAYBE move to be on the side of main monitor.
mode "1920x1080@60.000"
scale 1
transform "normal"
position x=1920 y=1080
}
output "Hewlett Packard HP ZR24w CNT01710L4" {
mode "1920x1200@60.000"
scale 1
transform "normal"
position x=960 y=960
}
output "Hewlett Packard HP ZR24w CNT0181039" {
mode "1920x1200@60.000"
scale 1
transform "normal"
position x=2880 y=960
}
//switch events for open closing lid.
switch-events {
lid-close { spawn "swaylock"; }
//lid-open { spawn "notify-send" "The laptop lid is open!"; }
tablet-mode-on { spawn "bash" "-c" "gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled true"; }
tablet-mode-off { spawn "bash" "-c" "gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled false"; }
}
// Settings that influence how windows are positioned and sized.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
layout {
// Set gaps around windows in logical pixels.
gaps 8
// When to center a column when changing focus, options are:
// - "never", default behavior, focusing an off-screen column will keep at the left
// or right edge of the screen.
// - "always", the focused column will always be centered.
// - "on-overflow", focusing a column will center it if it doesn't fit
// together with the previously focused column.
center-focused-column "on-overflow"
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
preset-column-widths {
// Proportion sets the width as a fraction of the output width, taking gaps into account.
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
// The default preset widths are 1/3, 1/2 and 2/3 of the output but that is annoying.
proportion 0.3333333
proportion 0.5
proportion 0.6666667
proportion 0.9
// Fixed sets the width in logical pixels exactly.
// fixed 1920
}
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
// preset-window-heights { }
// You can change the default width of the new windows.
default-column-width { proportion 0.5; }
// If you leave the brackets empty, the windows themselves will decide their initial width.
// default-column-width {}
// By default focus ring and border are rendered as a solid background rectangle
// behind windows. That is, they will show up through semitransparent windows.
// This is because windows using client-side decorations can have an arbitrary shape.
// If you don't like that, you should uncomment `prefer-no-csd` below.
// Niri will draw focus ring and border *around* windows that agree to omit their
// client-side decorations.
// Alternatively, you can override it with a window rule called
// `draw-border-with-background`.
// You can change how the focus ring looks.
focus-ring {
// Uncomment this line to disable the focus ring.
// off
// How many logical pixels the ring extends out from the windows.
width 2
// Colors can be set in a variety of ways:
// - CSS named colors: "red"
// - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
// - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
// Color of the ring on the active monitor.
active-color "#7fffc8"
// Color of the ring on inactive monitors.
inactive-color "#505050"
// You can also use gradients. They take precedence over solid colors.
// Gradients are rendered the same as CSS linear-gradient(angle, from, to).
// The angle is the same as in linear-gradient, and is optional,
// defaulting to 180 (top-to-bottom gradient).
// You can use any CSS linear-gradient tool on the web to set these up.
// Changing the color space is also supported, check the wiki for more info.
//
// active-gradient from="#80c8ff" to="#bbddff" angle=45
// You can also color the gradient relative to the entire view
// of the workspace, rather than relative to just the window itself.
// To do that, set relative-to="workspace-view".
//
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can also add a border. It's similar to the focus ring, but always visible.
border {
// The settings are the same as for the focus ring.
// If you enable the border, you probably want to disable the focus ring.
off
width 2
active-color "#ffc87f"
inactive-color "#505050"
// active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can enable drop shadows for windows.
shadow {
// Uncomment the next line to enable shadows.
on
// By default, the shadow draws only around its window, and not behind it.
// Uncomment this setting to make the shadow draw behind its window.
//
// Note that niri has no way of knowing about the CSD window corner
// radius. It has to assume that windows have square corners, leading to
// shadow artifacts inside the CSD rounded corners. This setting fixes
// those artifacts.
//
// However, instead you may want to set prefer-no-csd and/or
// geometry-corner-radius. Then, niri will know the corner radius and
// draw the shadow correctly, without having to draw it behind the
// window. These will also remove client-side shadows if the window
// draws any.
//
//draw-behind-window false
// You can change how shadows look. The values below are in logical
// pixels and match the CSS box-shadow properties.
// Softness controls the shadow blur radius.
softness 30
// Spread expands the shadow.
spread 5
// Offset moves the shadow relative to the window.
offset x=0 y=5
// You can also change the shadow color and opacity.
color "#0007"
}
// Struts shrink the area occupied by windows, similarly to layer-shell panels.
// You can think of them as a kind of outer gaps. They are set in logical pixels.
// Left and right struts will cause the next window to the side to always be visible.
// Top and bottom struts will simply add outer gaps in addition to the area occupied by
// layer-shell panels and regular gaps.
struts {
left 24
right 24
// top 64
// bottom 64
}
}
// Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart,
// which may be more convenient to use.
// See the binds section below for more spawn examples.
// spawn-at-startup "alacritty" "-e" "fish"
spawn-at-startup "foot" "--server"
spawn-at-startup "xwayland-satellite"
spawn-at-startup "mako"
spawn-at-startup "swww-daemon"
spawn-at-startup "waybar"
spawn-at-startup "swayidle" "-w" "timeout" "601" "niri msg action power-off-monitors" "timeout" "600" "swaylock -f" "before-sleep" "swaylock -f"
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
// If the client will specifically ask for CSD, the request will be honored.
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
// This option will also fix border/focus ring drawing behind some semitransparent windows.
// After enabling or disabling this, you need to restart the apps for this to take effect.
prefer-no-csd
// You can change the path where screenshots are saved.
// A ~ at the front will be expanded to the home directory.
// The path is formatted with strftime(3) to give you the screenshot date and time.
screenshot-path "~/Pictures/screenshots/screenshot-%Y-%m-%d %H-%M-%S.png"
// You can also set this to null to disable saving screenshots to disk.
// screenshot-path null
// Animation settings.
// The wiki explains how to configure individual animations:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations
animations {
// Uncomment to turn off all animations.
off
// Slow down all animations by this factor. Values below 1 speed them up instead.
// slowdown 3.0
}
// Window rules let you adjust behavior for individual windows.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
// Work around WezTerm's initial configure bug
// by setting an empty default-column-width.
window-rule {
// This regular expression is intentionally made as specific as possible,
// since this is the default config, and we want no false positives.
// You can get away with just app-id="wezterm" if you want.
match app-id=r#"^org\.wezfurlong\.wezterm$"#
default-column-width {}
}
// Open the Firefox picture-in-picture player as floating by default.
window-rule {
// This app-id regular expression will work for both:
// - host Firefox (app-id is "firefox")
// - Flatpak Firefox (app-id is "org.mozilla.firefox")
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
match app-id=r#"firefox$"# title="^Bitwarden$"
match app-id=r#"firefox$"# title="^Extension: (Bitwarden Password Manager) - Bitwarden — Mozilla Firefox$"
match app-id=r#"Bitwarden$"#
open-floating true
}
//niri overview python script.
window-rule {
match app-id=r#"niri-overview.py"#
match app-id=r#"niri_overview.py"#
match app-id=r#"niri_overview.bin"#
match app-id=r#"niri_overview"#
open-focused true
open-floating true
default-window-height { proportion 0.5; }
default-column-width { proportion 0.8; }
}
//fix steam notifications to bottom rigth
window-rule {
match app-id="steam" title=r#"^notificationtoasts_\d+_desktop$"#
default-floating-position x=10 y=10 relative-to="bottom-right"
}
// Example: block out two password managers from screen capture.
// (This example rule is commented out with a "/-" in front.)
/-window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
match app-id=r#"^Bitwarden$"#
block-out-from "screen-capture"
// Use this instead if you want them visible on third-party screenshot tools.
// block-out-from "screencast"
}
// Example: enable rounded corners for all windows.
// (This example rule is commented out with a "/-" in front.)
/-window-rule {
geometry-corner-radius 12
clip-to-geometry true
}
window-rule {
geometry-corner-radius 12
clip-to-geometry true
}
binds {
// Keys consist of modifiers separated by + signs, followed by an XKB key name
// in the end. To find an XKB name for a particular key, you may use a program
// like wev.
//
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
// when running as a winit window.
//
// Most actions that you can bind here can also be invoked programmatically with
// `niri msg action do-something`.
// Mod-Shift-/, which is usually the same as Mod-?,
// shows a list of important hotkeys.
Mod+Shift+Slash { show-hotkey-overlay; }
// spawn niri overview script
Mod+Slash { spawn "/home/gunalx/.config/niri/niri_overview/niri_overview.bin"; }
// for next release
// Mod+Slash { toggle-overview; }
// Suggested binds for running programs: terminal, app launcher, screen locker.
Mod+Return { spawn "foot"; }
Mod+D { spawn "fuzzel"; }
Super+M { spawn "swaylock"; }
// You can also use a shell. Do this if you need pipes, multiple commands, etc.
// Note: the entire command goes as a single argument in the end.
// Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; }
// Example volume keys mappings for PipeWire & WirePlumber.
// The allow-when-locked=true property makes them work even when the session is locked.
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
Mod+Shift+Q { close-window; }
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
Alt+Tab { focus-window-previous; }
Mod+Ctrl+Left { move-column-left; }
Mod+Ctrl+Down { move-window-down; }
Mod+Ctrl+Up { move-window-up; }
Mod+Ctrl+Right { move-column-right; }
Mod+Ctrl+H { move-column-left; }
Mod+Ctrl+J { move-window-down; }
Mod+Ctrl+K { move-window-up; }
Mod+Ctrl+L { move-column-right; }
// Alternative commands that move across workspaces when reaching
// the first or last window in a column.
// Mod+J { focus-window-or-workspace-down; }
// Mod+K { focus-window-or-workspace-up; }
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Shift+Left { focus-monitor-left; }
Mod+Shift+Down { focus-monitor-down; }
Mod+Shift+Up { focus-monitor-up; }
Mod+Shift+Right { focus-monitor-right; }
Mod+Shift+H { focus-monitor-left; }
Mod+Shift+J { focus-monitor-down; }
Mod+Shift+K { focus-monitor-up; }
Mod+Shift+L { focus-monitor-right; }
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
// Alternatively, there are commands to move just a single window:
// Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
// ...
// And you can also move a whole workspace to another monitor:
// Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
// ...
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+I { focus-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; }
Mod+Ctrl+I { move-column-to-workspace-up; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
// ...
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { move-workspace-up; }
Mod+Shift+U { move-workspace-down; }
Mod+Shift+I { move-workspace-up; }
// You can bind mouse wheel scroll ticks using the following syntax.
// These binds will change direction based on the natural-scroll setting.
//
// To avoid scrolling through workspaces really fast, you can use
// the cooldown-ms property. The bind will be rate-limited to this value.
// You can set a cooldown on any bind, but it's most useful for the wheel.
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
// Usually scrolling up and down with Shift in applications results in
// horizontal scrolling; these binds replicate that.
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
// Similarly, you can bind touchpad scroll "ticks".
// Touchpad scrolling is continuous, so for these binds it is split into
// discrete intervals.
// These binds are also affected by touchpad's natural-scroll, so these
// example binds are "inverted", since we have natural-scroll enabled for
// touchpads by default.
// Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
// Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
// You can refer to workspaces by index. However, keep in mind that
// niri is a dynamic workspace system, so these commands are kind of
// "best effort". Trying to refer to a workspace index bigger than
// the current workspace count will instead refer to the bottommost
// (empty) workspace.
//
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
// will all refer to the 3rd workspace.
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-column-to-workspace 1; }
Mod+Ctrl+2 { move-column-to-workspace 2; }
Mod+Ctrl+3 { move-column-to-workspace 3; }
Mod+Ctrl+4 { move-column-to-workspace 4; }
Mod+Ctrl+5 { move-column-to-workspace 5; }
Mod+Ctrl+6 { move-column-to-workspace 6; }
Mod+Ctrl+7 { move-column-to-workspace 7; }
Mod+Ctrl+8 { move-column-to-workspace 8; }
Mod+Ctrl+9 { move-column-to-workspace 9; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+1 { move-window-to-workspace 1; }
// Switches focus between the current and the previous workspace.
// Mod+Tab { focus-workspace-previous; }
// The following binds move the focused window in and out of a column.
// If the window is alone, they will consume it into the nearby column to the side.
// If the window is already in a column, they will expel it out.
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
// Consume one window from the right to the bottom of the focused column.
Mod+Comma { consume-window-into-column; }
// Expel the bottom window from the focused column to the right.
Mod+Period { expel-window-from-column; }
Mod+R { switch-preset-column-width; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
// Expand the focused column to space not taken up by other fully visible columns.
// Makes the column "fill the rest of the space".
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+C { center-column; }
// Finer width adjustments.
// This command can also:
// * set width in pixels: "1000"
// * adjust width in pixels: "-5" or "+5"
// * set width as a percentage of screen width: "25%"
// * adjust width as a percentage of screen width: "-10%" or "+10%"
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
// set-column-width "100" will make the column occupy 200 physical screen pixels.
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
// Finer height adjustments when in column with other windows.
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
// Move the focused window between the floating and the tiling layout.
Mod+V { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
// Toggle tabbed column display mode.
// Windows in this column will appear as vertical tabs,
// rather than stacked on top of each other.
Mod+W { toggle-column-tabbed-display; }
// Actions to switch layouts.
// Note: if you uncomment these, make sure you do NOT have
// a matching layout switch hotkey configured in xkb options above.
// Having both at once on the same hotkey will break the switching,
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
// Mod+Space { switch-layout "next"; }
// Mod+Shift+Space { switch-layout "prev"; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
// Applications such as remote-desktop clients and software KVM switches may
// request that niri stops processing the keyboard shortcuts defined here
// so they may, for example, forward the key presses as-is to a remote machine.
// It's a good idea to bind an escape hatch to toggle the inhibitor,
// so a buggy application can't hold your session hostage.
//
// The allow-inhibiting=false property can be applied to other binds as well,
// which ensures niri always processes them, even when an inhibitor is active.
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
// The quit action will show a confirmation dialog to avoid accidental exits.
Mod+Shift+E { quit; }
Ctrl+Alt+Delete { quit; }
// Powers off the monitors. To turn them back on, do any input like
// moving the mouse or pressing any other key.
Mod+Shift+P { power-off-monitors; }
}
//Enviroment to be set.
environment {
DISPLAY ":0"
ELECTRON_OZONE_PLATFORM_HINT "auto"
}

View File

@@ -1,162 +1,45 @@
{ pkgs, lib, config, ... }:
let
im = config.i18n.inputMethod;
cfg = im.fcitx5;
fcitx5Package = pkgs.libsForQt5.fcitx5-with-addons.override { inherit (cfg) addons; };
in
{ pkgs, lib, ... }:
{
i18n.inputMethod = {
enabled = "fcitx5";
fcitx5.addons = with pkgs; [
fcitx5-mozc
fcitx5-gtk
fcitx5-chinese-addons
];
};
enable = true;
type = "fcitx5";
fcitx5 = {
# 1) Load the GTK bridge, the classic UI and the Catppuccin theme package
addons = with pkgs; [
fcitx5-gtk
fcitx5-mozc
catppuccin-fcitx5
];
xdg.configFile = let
format = pkgs.formats.iniWithGlobalSection { };
in {
"fcitx5/profile" = {
force = true;
source = format.generate "fcitx5-profile" {
sections = {
"Groups/0" = {
Name = "Default";
"Default Layout" = "us";
DefaultIM = "mozc";
};
"Groups/0/Items/0" = {
Name = "keyboard-us";
Layout = "";
};
"Groups/0/Items/1" = {
Name = "keyboard-no";
Layout = "";
};
"Groups/0/Items/2" = {
Name = "mozc";
Layout = "";
};
# 2) Install the Catppuccin theme under $XDG_DATA_HOME/fcitx5/themes/catppuccin
themes = {
catppuccin = {
highlightImage = "${pkgs.catppuccin-fcitx5}/share/fcitx5/themes/catppuccin/highlight.svg";
panelImage = "${pkgs.catppuccin-fcitx5}/share/fcitx5/themes/catppuccin/panel.svg";
theme = "${pkgs.catppuccin-fcitx5}/share/fcitx5/themes/catppuccin/theme.conf";
};
}; # i18n.inputMethod.fcitx5.themes.<name> … [source_id=2]
settings = {
# 3) Tell the classic UI to use “catppuccin”
addons.classicui.globalSection = {
Theme = "catppuccin";
};
"Groups/1" = {
Name = "Default";
"Default Layout" = "jp";
DefaultIM = "mozc";
};
"Groups/1/Items/0" = {
Name = "keyboard-us";
Layout = "";
};
"Groups/1/Items/1" = {
Name = "keyboard-no";
Layout = "";
};
"Groups/1/Items/2" = {
Name = "mozc";
Layout = "";
};
GroupOrder = {
"0" = "Default";
"1" = "Secondary";
};
# 4) Your other config (hotkey, layouts, IM engines…)
globalOptions."Global" = {
TriggerKey = "Control+space";
};
inputMethod."Default" = {
Enabled = "xkb:us::eng,xkb:no::nob,xkb:jp::jpn,mozc";
};
};
};
"fcitx5/config".source = format.generate "fcitx5-config" {
sections = {
Hotkey = {
# Enumerate when press trigger key repeatedly
EnumerateWithTriggerKeys = "True";
# Temporally switch between first and current Input Method
AltTriggerKeys = "";
# Enumerate Input Method Forward
EnumerateForwardKeys = "";
# Enumerate Input Method Backward
EnumerateBackwardKeys = "";
# Skip first input method while enumerating
EnumerateSkipFirst = "False";
};
"Hotkey/TriggerKeys" = {
"0" = "Control+space";
"1" = "Zenkaku_Hankaku";
"2" = "Hangul";
};
"Hotkey/EnumerateGroupForwardKeys"."0" = "Super+space";
"Hotkey/EnumerateGroupBackwardKeys"."0" = "Shift+Super+space";
"Hotkey/ActivateKeys"."0" = "Hangul_Hanja";
"Hotkey/DeactivateKeys"."0" = "Hangul_Romaja";
"Hotkey/PrevPage"."0" = "Up";
"Hotkey/NextPage"."0" = "Down";
"Hotkey/PrevCandidate"."0" = "Shift+Tab";
"Hotkey/NextCandidate"."0" = "Tab";
"Hotkey/TogglePreedit"."0" = "Control+Alt+P";
Behaviour = {
# Active By Default
ActiveByDefault = "False";
# Share Input State
ShareInputState = "All";
# Show preedit in application
PreeditEnabledByDefault = "True";
# Show Input Method Information when switch input method
ShowInputMethodInformation = "True";
# Show Input Method Information when changing focus
showInputMethodInformationWhenFocusIn = "False";
# Show compact input method information
CompactInputMethodInformation = "True";
# Show first input method information
ShowFirstInputMethodInformation = "True";
# Default page size
DefaultPageSize = 5;
# Override Xkb Option
OverrideXkbOption = "False";
# Custom Xkb Option
CustomXkbOption = "";
# Force Enabled Addons
EnabledAddons = "";
# Force Disabled Addons
DisabledAddons = "";
# Preload input method to be used by default
PreloadInputMethod = "True";
# Allow input method in the password field
AllowInputMethodForPassword = "False";
# Show preedit text when typing password
ShowPreeditForPassword = "False";
# Interval of saving user data in minutes
AutoSavePeriod = 30;
};
};
};
"fcitx5/conf/classicui.conf".source = format.generate "fcitx5-classicui.conf" {
globalSection = {
Theme = "Material-Color";
PerScreenDPI = "True";
# Font = "";
"Vertical Candidate List" = "True";
};
};
};
xdg.dataFile."fcitx5/themes/Material-Color" = {
recursive = true;
source = "${pkgs.fcitx5-material-color}/share/fcitx5/themes/Material-Color-teal";
};
systemd.user.services.fcitx5-daemon = {
Service.Restart="on-failure";
Service.ExecStart = lib.mkForce "${fcitx5Package}/bin/fcitx5";
Service.ExecReload = "/bin/kill -HUP $MAINPID";
};
# 5) Force your own ExecStart so you never get “conflicting definition” errors
systemd.user.services.fcitx5-daemon.Service.ExecStart =
lib.mkForce "${pkgs.fcitx5-with-addons}/bin/fcitx5";
}

View File

@@ -9,7 +9,7 @@
main = {
term = "xterm-256color";
font = "0xproto:size=12";
font = "0xproto:size=14";
#dpi-aware = "yes";
};
mouse = {
@@ -19,8 +19,6 @@
colors = {
alpha = "0.7";
#set based on https://github.com/tinted-theming/base16-foot/blob/main/colors/base16-apathy.ini and https://github.com/tinted-theming/base16-schemes/blob/main/apathy.yaml
foreground = "${config.colorScheme.palette.base05}";
background = "${config.colorScheme.palette.base00}";

View File

@@ -4,6 +4,8 @@
./base.nix
./code.nix
./sway.nix
./niri.nix
../common/fonts.nix
./colors.nix
#./stylix.nix

52
home/gunalx/fuzzel.nix Normal file
View File

@@ -0,0 +1,52 @@
{ config, pkgs, lib, inputs, ... }:
let
palette = config.colorScheme.palette;
hex = colour: lib.removePrefix "#" colour;
in
{
programs.fuzzel = {
enable = true;
package = pkgs.fuzzel;
settings = {
main = {
terminal = "${pkgs.foot}/bin/foot";
layer = "overlay";
use-bold = true;
fields = "filename,name,keywords,exec,comment,generic";
tabs = "4";
width = 60; # Wider window (characters)
lines = 20; # Show more items vertically
horizontal-pad = 50; # Horizontal padding
vertical-pad = 15; # Vertical padding
font = "monospace:size=16";
anchor = "top";
y-margin = 240;
icons-enabled = true;
# match-mode = "fzf";
# image-size-ratio = 0.5;
};
colors = {
background = "${hex palette.base00}ff";
text = "${hex palette.base03}ff";
prompt = "${hex palette.base03}ff";
placeholder = "${hex palette.base03}ff";
input = "${hex palette.base05}ff";
match = "${hex palette.base08}ff";
selection = "${hex palette.base02}ff";
"selection-text" = "${hex palette.base05}ff";
"selection-match" = "${hex palette.base08}ff";
counter = "${hex palette.base04}ff";
border = "${hex palette.base03}ff";
};
border = {
radius = 20;
width = 3;
};
};
};
}

50
home/gunalx/mako.nix Normal file
View File

@@ -0,0 +1,50 @@
{ config, pkgs, ... }:
let
palette = config.colorscheme.palette;
in {
services.mako = {
enable = true; # Turn on mako
package = pkgs.mako; # Which package to use
# Colors (from your colorscheme)
settings.background-color = "#${palette.base00}FF"; # popup background
settings.text-color = "#${palette.base05}FF"; # popup text
settings.border-color = "#${palette.base03}FF"; # popup border
settings.progress-color = "over #${palette.base0A}FF"; # progress bar
# Placement & layering
settings.anchor = "top-right"; # corner on screen
settings.layer = "overlay"; # appear above fullscreen
# Geometry
settings.width = 320; # px
settings.height = 120; # max px
settings.margin = "10"; # all edges
settings.padding = "8"; # all edges
settings.border-size = 2; # px
settings.border-radius = 12; # px
# Font & icons
settings.font = "monospace 10"; # Pango font
settings.icons = true; # show icons
settings.max-icon-size = 48; # px
# Behavior & timing
settings.default-timeout = 5000; # ms; 0 = no timeout
settings.ignore-timeout = true; # use defaultTimeout always
settings.actions = true; # clickable actions
settings.max-visible = 5; # simultaneous popups
settings.sort = "-time"; # newest first
settings.group-by = "app-name"; # grouping criteria
settings.markup = true; # enable Pango markup
settings."actionable=true" = {
default-timeout = 15000;
border-radius = 24;
border-color = "#${palette.base08}FF";
};
};
}

655
home/gunalx/niri.nix Normal file
View File

@@ -0,0 +1,655 @@
{ pkgs, config, lib, ... }:
let
palette = config.colorScheme.palette;
niriConfig = ''
// KDLformat niri config
input {
keyboard { xkb { layout "us,no"; options "grp:ctrl_space_toggle"; }; }
touchpad {
tap
natural-scroll
accel-speed 0.1
accel-profile "flat"
}
warp-mouse-to-focus
focus-follows-mouse max-scroll-amount="0%"
}
output "AU Optronics 0x212B Unknown" {
mode "3840x2160@60.002"
//focus-at-startup
scale 2
transform "normal"
position x=1920 y=2160
}
output "ASUSTek COMPUTER INC ASUS MB16AH L9LMTF068515" {
mode "1920x1080@60.000"
scale 1
transform "normal"
position x=1920 y=1080
}
output "Hewlett Packard HP ZR24w CNT01710L4" {
mode "1920x1200@60.000"
scale 1
transform "normal"
position x=960 y=960
}
output "Hewlett Packard HP ZR24w CNT0181039" {
mode "1920x1200@60.000"
scale 1
transform "normal"
position x=2880 y=960
}
//desktop outputs.
output "Dell Inc. DELL U2410 F525M06G123L" {
mode "2560x1440@144.000"
scale 1
transform "90"
position x=0 y=0
}
output "Samsung Electric Company LC27G5xT H4LR800468" {
mode "1920x1200@59.950"
variable-refresh-rate on-demand=true
//focus-at-startup
scale 1
transform "normal"
position x=1200 y=240
}
//switch events for open closing lid.
switch-events {
lid-close { spawn "swaylock"; }
//lid-open { spawn "notify-send" "The laptop lid is open!"; }
tablet-mode-on { spawn "bash" "-c" "wvkbd-mobintl"; }
tablet-mode-off { spawn "bash" "-c" "pkill wvkbd-mobintl"; }
}
// Settings that influence how windows are positioned and sized.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
layout {
// Set gaps around windows in logical pixels.
gaps 8
// When to center a column when changing focus, options are:
// - "never", default behavior, focusing an off-screen column will keep at the left
// or right edge of the screen.
// - "always", the focused column will always be centered.
// - "on-overflow", focusing a column will center it if it doesn't fit
// together with the previously focused column.
center-focused-column "on-overflow"
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
preset-column-widths {
// Proportion sets the width as a fraction of the output width, taking gaps into account.
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
// The default preset widths are 1/3, 1/2 and 2/3 of the output but that is annoying.
proportion 0.3333333
proportion 0.5
proportion 0.6666667
// Fixed sets the width in logical pixels exactly.
// fixed 1920
}
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
preset-window-heights {
proportion 1.0
proportion 0.5
}
// You can change the default width of the new windows.
default-column-width { proportion 1.0; }
// If you leave the brackets empty, the windows themselves will decide their initial width.
// default-column-width {}
// By default focus ring and border are rendered as a solid background rectangle
// behind windows. That is, they will show up through semitransparent windows.
// This is because windows using client-side decorations can have an arbitrary shape.
// If you don't like that, you should uncomment `prefer-no-csd` below.
// Niri will draw focus ring and border *around* windows that agree to omit their
// client-side decorations.
// Alternatively, you can override it with a window rule called
// `draw-border-with-background`.
// You can change how the focus ring looks.
focus-ring {
// Uncomment this line to disable the focus ring.
// off
// How many logical pixels the ring extends out from the windows.
width 2
// Colors can be set in a variety of ways:
// - CSS named colors: "red"
// - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
// - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
// Color of the ring on the active monitor.
active-color "${palette.base0D}"
// Color of the ring on inactive monitors.
inactive-color "${palette.base03}"
// You can also use gradients. They take precedence over solid colors.
// Gradients are rendered the same as CSS linear-gradient(angle, from, to).
// The angle is the same as in linear-gradient, and is optional,
// defaulting to 180 (top-to-bottom gradient).
// You can use any CSS linear-gradient tool on the web to set these up.
// Changing the color space is also supported, check the wiki for more info.
//
// active-gradient from="#80c8ff" to="#bbddff" angle=45
// You can also color the gradient relative to the entire view
// of the workspace, rather than relative to just the window itself.
// To do that, set relative-to="workspace-view".
//
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can also add a border. It's similar to the focus ring, but always visible.
border {
// The settings are the same as for the focus ring.
// If you enable the border, you probably want to disable the focus ring.
off
width 2
active-color "${palette.base0A}"
inactive-color "${palette.base03}"
// active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can enable drop shadows for windows.
shadow {
// Uncomment the next line to enable shadows.
on
// By default, the shadow draws only around its window, and not behind it.
// Uncomment this setting to make the shadow draw behind its window.
//
// Note that niri has no way of knowing about the CSD window corner
// radius. It has to assume that windows have square corners, leading to
// shadow artifacts inside the CSD rounded corners. This setting fixes
// those artifacts.
//
// However, instead you may want to set prefer-no-csd and/or
// geometry-corner-radius. Then, niri will know the corner radius and
// draw the shadow correctly, without having to draw it behind the
// window. These will also remove client-side shadows if the window
// draws any.
//
//draw-behind-window false
// You can change how shadows look. The values below are in logical
// pixels and match the CSS box-shadow properties.
// Softness controls the shadow blur radius.
softness 30
// Spread expands the shadow.
spread 5
// Offset moves the shadow relative to the window.
offset x=0 y=5
// You can also change the shadow color and opacity.
color "#0007"
}
// Struts shrink the area occupied by windows, similarly to layer-shell panels.
// You can think of them as a kind of outer gaps. They are set in logical pixels.
// Left and right struts will cause the next window to the side to always be visible.
// Top and bottom struts will simply add outer gaps in addition to the area occupied by
// layer-shell panels and regular gaps.
struts {
left 24
right 24
// top 64
// bottom 64
}
}
overview {
zoom 0.5
backdrop-color "#${palette.base00}"
}
// Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart,
// which may be more convenient to use.
// See the binds section below for more spawn examples.
// spawn-at-startup "alacritty" "-e" "fish"
spawn-at-startup "foot" "--server"
spawn-at-startup "xwayland-satellite"
spawn-at-startup "mako"
spawn-at-startup "swww-daemon"
//spawn-at-startup "waybar" //spawns by system service instead
spawn-at-startup "swayidle" "-w" "timeout" "601" "niri msg action power-off-monitors" "timeout" "600" "swaylock -f" "before-sleep" "swaylock -f"
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
// If the client will specifically ask for CSD, the request will be honored.
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
// This option will also fix border/focus ring drawing behind some semitransparent windows.
// After enabling or disabling this, you need to restart the apps for this to take effect.
prefer-no-csd
// You can change the path where screenshots are saved.
// A ~ at the front will be expanded to the home directory.
// The path is formatted with strftime(3) to give you the screenshot date and time.
screenshot-path "~/Pictures/screenshots/screenshot-%Y-%m-%d %H-%M-%S.png"
// Animation settings.
// The wiki explains how to configure individual animations:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations
animations {
// Uncomment to turn off all animations.
off
// Slow down all animations by this factor. Values below 1 speed them up instead.
// slowdown 0.3
}
layer-rule {
match namespace="^notifications$"
block-out-from "screencast"
}
// Window rules let you adjust behavior for individual windows.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
// Floating Bitwarden extension popup windows only
window-rule {
match title=r#"^Extension: \(Bitwarden Password Manager\) - Bitwarden Mozilla Firefox$"#
match title="^Extension: (Bitwarden Password Manager) - Bitwarden Mozilla Firefox$"
match app-id=r#"(?i)^bitwarden$"#
open-floating true
default-column-width { proportion 0.3;}
default-floating-position x=0 y=0 relative-to="top-left"
opacity 0.9
block-out-from "screen-capture"
}
// dropdown terminal
window-rule {
match title="^dropdown$"
open-focused true
open-floating true
default-floating-position x=0 y=0 relative-to="top"
default-window-height { proportion 0.5; }
// 80% of the screen wide.
default-column-width { proportion 0.8; }
// block-out-from "screencast"
block-out-from "screen-capture"
}
//fix steam notifications to bottom rigth
window-rule {
match app-id="steam" title=r#"^notificationtoasts_\d+_desktop$"#
default-floating-position x=10 y=10 relative-to="bottom-right"
//block-out-from "screencast"
block-out-from "screen-capture"
}
window-rule {
geometry-corner-radius 12
clip-to-geometry true
}
window-rule {
match app-id="onboard"
match app-id="Onboard"
open-floating true
default-window-height { proportion 0.2; }
default-column-width { proportion 0.8; }
block-out-from "screen-capture"
}
binds {
// Keys consist of modifiers separated by + signs, followed by an XKB key name
// in the end. To find an XKB name for a particular key, you may use a program
// like wev.
//
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
// when running as a winit window.
//
// Most actions that you can bind here can also be invoked programmatically with
// `niri msg action do-something`.
// Mod-Shift-/, which is usually the same as Mod-?,
// shows a list of important hotkeys.
Mod+Shift+Slash { show-hotkey-overlay; }
Mod+Slash { toggle-overview; }
// Suggested binds for running programs: terminal, app launcher, screen locker.
Mod+Return { spawn "footclient"; }
Mod+T { spawn "sh" "-c" "if pgrep -f '^foot -T dropdown$' >/dev/null; then pkill -f '^foot -T dropdown$'; else exec foot -T dropdown; fi"; }
Mod+D { spawn "fuzzel"; }
Mod+M { spawn "swaylock" "--grace" "0"; }
Mod+O { toggle-window-rule-opacity; }
// You can also use a shell. Do this if you need pipes, multiple commands, etc.
// Note: the entire command goes as a single argument in the end.
// Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; }
// Example volume keys mappings for PipeWire & WirePlumber.
// The allow-when-locked=true property makes them work even when the session is locked.
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
Mod+Shift+Q { close-window; }
Mod+Left { focus-column-or-monitor-left; }
Mod+Down { focus-window-or-monitor-down; }
Mod+Up { focus-window-or-monitor-up; }
Mod+Right { focus-column-or-monitor-right; }
Mod+H { focus-column-or-monitor-left; }
Mod+J { focus-window-or-monitor-down; }
Mod+K { focus-window-or-monitor-up; }
Mod+L { focus-column-or-monitor-right; }
Alt+Tab { focus-window-previous; }
Mod+Ctrl+Left { move-column-left; }
Mod+Ctrl+Down { move-window-down; }
Mod+Ctrl+Up { move-window-up; }
Mod+Ctrl+Right { move-column-right; }
Mod+Ctrl+H { move-column-left; }
Mod+Ctrl+J { move-window-down; }
Mod+Ctrl+K { move-window-up; }
Mod+Ctrl+L { move-column-right; }
// Alternative commands that move across workspaces when reaching
// the first or last window in a column.
// Mod+J { focus-window-or-workspace-down; }
// Mod+K { focus-window-or-workspace-up; }
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Shift+Left { focus-monitor-left; }
Mod+Shift+Down { focus-monitor-down; }
Mod+Shift+Up { focus-monitor-up; }
Mod+Shift+Right { focus-monitor-right; }
Mod+Shift+H { focus-monitor-left; }
Mod+Shift+J { focus-monitor-down; }
Mod+Shift+K { focus-monitor-up; }
Mod+Shift+L { focus-monitor-right; }
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
// Alternatively, there are commands to move just a single window:
// Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
// ...
// And you can also move a whole workspace to another monitor:
// Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
// ...
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+I { focus-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; }
Mod+Ctrl+I { move-column-to-workspace-up; }
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { move-workspace-up; }
Mod+Shift+U { move-workspace-down; }
Mod+Shift+I { move-workspace-up; }
// You can bind mouse wheel scroll ticks using the following syntax.
// These binds will change direction based on the natural-scroll setting.
//
// To avoid scrolling through workspaces really fast, you can use
// the cooldown-ms property. The bind will be rate-limited to this value.
// You can set a cooldown on any bind, but it's most useful for the wheel.
Mod+Shift+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+Shift+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Shift+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+Shift+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight cooldown-ms=150 { focus-column-right; }
Mod+WheelScrollLeft cooldown-ms=150 { focus-column-left; }
Mod+Ctrl+WheelScrollRight cooldown-ms=150 { move-column-right; }
Mod+Ctrl+WheelScrollLeft cooldown-ms=150 { move-column-left; }
// Usually scrolling up and down with Shift in applications results in
// horizontal scrolling; these binds replicate that.
// But i found it impractical. workspaces i can graphically cahnge. and probably more rarly, so i swapped it
Mod+WheelScrollDown cooldown-ms=150 { focus-column-right; }
Mod+WheelScrollUp cooldown-ms=150 { focus-column-left; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-right; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-left; }
// Similarly, you can bind touchpad scroll "ticks".
// Touchpad scrolling is continuous, so for these binds it is split into
// discrete intervals.
// These binds are also affected by touchpad's natural-scroll, so these
// example binds are "inverted", since we have natural-scroll enabled for
// touchpads by default.
// Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
// Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
// You can refer to workspaces by index. However, keep in mind that
// niri is a dynamic workspace system, so these commands are kind of
// "best effort". Trying to refer to a workspace index bigger than
// the current workspace count will instead refer to the bottommost
// (empty) workspace.
//
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
// will all refer to the 3rd workspace.
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-column-to-workspace 1; }
Mod+Ctrl+2 { move-column-to-workspace 2; }
Mod+Ctrl+3 { move-column-to-workspace 3; }
Mod+Ctrl+4 { move-column-to-workspace 4; }
Mod+Ctrl+5 { move-column-to-workspace 5; }
Mod+Ctrl+6 { move-column-to-workspace 6; }
Mod+Ctrl+7 { move-column-to-workspace 7; }
Mod+Ctrl+8 { move-column-to-workspace 8; }
Mod+Ctrl+9 { move-column-to-workspace 9; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+1 { move-window-to-workspace 1; }
// Switches focus between the current and the previous workspace.
// Mod+Tab { focus-workspace-previous; }
// The following binds move the focused window in and out of a column.
// If the window is alone, they will consume it into the nearby column to the side.
// If the window is already in a column, they will expel it out.
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
// Consume one window from the right to the bottom of the focused column.
Mod+Comma { consume-window-into-column; }
// Expel the bottom window from the focused column to the right.
Mod+Period { expel-window-from-column; }
Mod+R { switch-preset-column-width; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
Mod+Ctrl+Shift+F { toggle-windowed-fullscreen; }
// Expand the focused column to space not taken up by other fully visible columns.
// Makes the column "fill the rest of the space".
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+C { center-column; }
// Finer width adjustments.
// This command can also:
// * set width in pixels: "1000"
// * adjust width in pixels: "-5" or "+5"
// * set width as a percentage of screen width: "25%"
// * adjust width as a percentage of screen width: "-10%" or "+10%"
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
// set-column-width "100" will make the column occupy 200 physical screen pixels.
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+0 { set-column-width "+10%"; }
// Finer height adjustments when in column with other windows.
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
Mod+Shift+0 { set-window-height "+10%"; }
// Move the focused window between the floating and the tiling layout.
Mod+V { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
// Toggle tabbed column display mode.
// Windows in this column will appear as vertical tabs,
// rather than stacked on top of each other.
Mod+W { toggle-column-tabbed-display; }
// Actions to switch layouts.
// Note: if you uncomment these, make sure you do NOT have
// a matching layout switch hotkey configured in xkb options above.
// Having both at once on the same hotkey will break the switching,
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
// Mod+Space { switch-layout "next"; }
// Mod+Shift+Space { switch-layout "prev"; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
// Applications such as remote-desktop clients and software KVM switches may
// request that niri stops processing the keyboard shortcuts defined here
// so they may, for example, forward the key presses as-is to a remote machine.
// It's a good idea to bind an escape hatch to toggle the inhibitor,
// so a buggy application can't hold your session hostage.
//
// The allow-inhibiting=false property can be applied to other binds as well,
// which ensures niri always processes them, even when an inhibitor is active.
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
// The quit action will show a confirmation dialog to avoid accidental exits.
Mod+Shift+E { quit; }
Ctrl+Alt+Delete { quit; }
// Powers off the monitors. To turn them back on, do any input like
// moving the mouse or pressing any other key.
Mod+Shift+P { power-off-monitors; }
}
//Enviroment to be set.
environment {
DISPLAY ":0"
ELECTRON_OZONE_PLATFORM_HINT "auto"
}
'';
in
{
imports = [
./waybar.nix
./wallpapers.nix
./foot.nix
./swaylock.nix
./wlogout.nix
./mako.nix
./fcitx5.nix
./fuzzel.nix
];
home.packages = with pkgs; [
niri
wl-clipboard
pass-wayland
wev
#term
foot
alacritty
wdisplays
swww
xwayland-satellite
#bar applets and notifications
waybar
networkmanagerapplet
networkmanager
libsForQt5.networkmanager-qt
mako
swayidle
#ligth and sound
brightnessctl
pavucontrol
fuzzel
emote
wvkbd
xdg-desktop-portal-gtk
xdg-desktop-portal
xdg-desktop-portal-wlr
xdg-desktop-portal-gnome
#fonts
_0xproto
font-awesome
font-awesome_5
font-awesome_4
];
# Drop the interpolated KDL into ~/.config/niri/config.kdl
home.file.".config/niri/config.kdl" = {
text = niriConfig;
};
}

View File

@@ -13,10 +13,11 @@ in
imports = [
./waybar.nix
./foot.nix
./fonts.nix
./fcitx5.nix
./kanshi.nix
./swaylock.nix
./mako.nix
./wlogout.nix
#./assets/wallpapers
];
@@ -47,7 +48,6 @@ in
#swaybg
swww
wleave
#bar applets and notifications
waybar
@@ -84,17 +84,6 @@ in
slurp
#fonts
nerdfonts
noto-fonts
noto-fonts-cjk
noto-fonts-emoji
liberation_ttf
fira-code
fira-code-symbols
nerdfonts
ubuntu_font_family
zpix-pixel-font
_0xproto
font-awesome
font-awesome_5
font-awesome_4
@@ -156,7 +145,19 @@ in {
#wallpaper
{command = "swww-daemon";}
{command = "while true; do for wallpaper in $WALLPAPER_DIR/*; do swww img $wallpaper; sleep 15; done; done;";}
{command = ''sleep 3 \
wallpapers=("/home/gunalx/Pictures/wallpapers"/*.{jpg,jpeg,png,gif}) \
transitions=(fade left right top bottom wipe wave grow center outer) \
i=0 \
while true; do \
img="''${wallpapers[i % ''${#wallpapers[@]}]}" \
trans="''${transitions[i % ''${#transitions[@]}]}" \
swww img "$img" --transition-type "$trans" --transition-fps 60 --transition-duration 3 \
((i++)) \
sleep 15m \
done
'';}
#{command = "while true; do for wallpaper in $WALLPAPER_DIR/*; do swww img $wallpaper; sleep 15; done; done;";}
#idlelock
{command = ''swayidle \
@@ -274,7 +275,7 @@ in {
#"ctrl+space" = "exec xkb_switch_layout next"; #TODO:verify
"${cfg.config.modifier}+tab" = "${menu}";
"Alt+tab" = "workspace back_and_forth";
"XF86PowerOff" = "exec ${pkgs.wleave}/bin/wleave";
"XF86PowerOff" = "exec ${pkgs.wlogout}/bin/wlogout";
};
};

View File

@@ -3,33 +3,40 @@ let
palette = config.colorScheme.palette;
in
{
imports = [
];
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = {
color = palette.base00;
screenshots = true;
grace = 15;
clock = true;
submit-on-touch = true;
indicator-idle-visible = true;
indicator-radius = 100;
indicator-thickness = 7;
ring-color = palette.base05;
key-hl-color = palette.base03;
tect-color = palette.base00;
line-colot = palette.base00;
innside-color = palette.base04;
seperator-color = palette.base00;
fade-in = 0.1;
effect-scale = 0.6;
effect-blur = "7x3";
# screen & indicator
color = "#${palette.base00}AA"; # --color
screenshots = true; # --screenshots
fade-in = 0.1; # --fade-in
scaling = "fill"; # e.g. --scaling=fill
# authentication grace
grace = 3; # --grace
submit-on-touch = true; # --submit-on-touch
# clock
clock = true; # --clock
# indicator visuals
indicator-idle-visible = true; # --indicator-idle-visible
indicator-radius = 100; # --indicator-radius
indicator-thickness = 7; # --indicator-thickness
# indicator colors
ring-color = "#${palette.base0D}C0"; # --ring-color
key-hl-color = "#${palette.base0E}C0"; # --key-hl-color
text-color = "#${palette.base05}FF"; # --text-color
inside-color = "#${palette.base02}CC"; # --inside-color
line-color = "#${palette.base01}99"; # --line-color
separator-color = "#${palette.base01}99"; # --separator-color
# effects
effect-scale = 0.6; # --effect-scale
effect-blur = "7x3"; # --effect-blur
};
};
}

View File

@@ -0,0 +1,23 @@
{ lib, config, ... }:
let
# Path to your source folder of wallpapers
wallpaperSrc = ./wallpapers;
# Read all file names in that directory
names = lib.attrNames (builtins.readDir wallpaperSrc);
# For each name, produce an attrset mapping
wallpaperFiles = map (name:
{
# quoted string keys are valid attribute names
"Pictures/wallpapers/${name}" = {
source = "${wallpaperSrc}/${name}";
};
}
) names;
in
{
# Merge them all under home.file
home.file = lib.mkMerge wallpaperFiles;
}

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1016 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 MiB

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 KiB

View File

@@ -1,376 +1,291 @@
{ pkgs, inputs, lib, config, nix-colors, ... }:
{ config, pkgs, lib, inputs, ... }:
let
# Import Base16 palette & hex→RGB helper
inherit (inputs.nix-colors.lib.conversions) hexToRGBString;
inherit (config.colorscheme) palette;
# Build "rgba(r,g,b,a)" strings
toRGBA = colour: alpha:
let rgb = hexToRGBString "," (lib.removePrefix "#" colour);
in "rgba(${rgb},${alpha})";
in
{
imports = [
];
home.packages = with pkgs; [
fuzzel
wvkbd
];
programs.waybar = let
inherit (inputs.nix-colors.lib.conversions) hexToRGBString;
inherit (config.colorscheme) colors;
inherit (config.colorscheme) palette;
toRGBA = color: opacity: "rgba(${hexToRGBString "," (lib.removePrefix "#" color)},${opacity})";
in {
programs.waybar = {
enable = true;
package = pkgs.waybar;
# Single-bar JSON config
settings = [
(builtins.fromJSON ''
{
"layer": "top",
"height": 36,
"spacing": 2,
"tray-position": "right",
"tray-all-outputs": true,
"modules-left": ["custom/overview", "custom/launcher", "custom/keyboard", "sway/workspaces", "niri/workspaces"],
"modules-center": ["niri/window"],
"modules-right": [
"idle_inhibitor", "backlight", "pulseaudio", "keyboard-state",
"network", "cpu", "memory", "temperature", "battery",
"power-profiles-daemon", "clock", "tray", "custom/power"
],
"custom/launcher": {
"format": " ",
"on-click": "pkill fuzzel || fuzzel"
},
"sway/workspaces": {
"format": "{index}: {name} - {icon}",
"format-icons": {
"focused":"","active":"","default":""
},
"all-outputs": false,
"current-only": false,
"persistent": true,
"on-click": "swaymsg workspace number {index}"
},
"niri/workspaces": {
"format": "{index}: {name} - {icon}",
"format-icons": {
"focused":"","active":"","default":""
},
"all-outputs": false,
"current-only": false,
"persistent": true,
"on-click": "niri msg workspace {index}"
},
"custom/overview": {
"format": "",
"tooltip": "Toggle Overview",
"on-click": "niri msg action toggle-overview"
},
"custom/keyboard": {
"format": "",
"tooltip": "On-Screen Keyboard",
"on-click": "pkill wvkbd-mobintl || wvkbd-mobintl"
},
"niri/window": {
"format": "{title}"
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": { "activated":"","deactivated":"" }
},
"backlight": {
"format": "{percent}% {icon}",
"format-icons": ["","","","","","","","",""]
},
"pulseaudio": {
"format": "{volume}% {icon}",
"format-muted": "",
"format-icons": { "default": ["","",""] },
"on-click": "pavucontrol"
},
"keyboard-state": {
"numlock": true,
"capslock": true,
"format": "{icon}",
"format-icons": { "locked":"","unlocked":"" }
},
"network": {
"format-wifi": " {essid} ({signalStrength}%)",
"format-ethernet": " {ipaddr}",
"format-disconnected": " Disconnected",
"format-alt": " {ipaddr}/{cidr}",
"tooltip": true,
"tooltip-format-wifi": "<span color='#${palette.base0C}'></span> <span color='#${palette.base05}'>WiFi</span>\n<span color='#${palette.base0A}'>SSID:</span> <span color='#${palette.base06}'>{essid}</span>\n<span color='#${palette.base0A}'>Interface:</span> <span color='#${palette.base04}'>{ifname}</span>\n<span color='#${palette.base0A}'>IP:</span> <span color='#${palette.base06}'>{ipaddr}</span>\n<span color='#${palette.base0A}'>IPv6:</span> <span color='#${palette.base04}'>{ipaddr6}</span>\n<span color='#${palette.base0A}'>Gateway:</span> <span color='#${palette.base04}'>{gwaddr}</span>\n<span color='#${palette.base0A}'>Frequency:</span> <span color='#${palette.base04}'>{frequency} MHz</span>\n<span color='#${palette.base0A}'>Signal:</span> <span color='#${palette.base0B}'>{signalStrength}%</span> <span color='#${palette.base04}'>({signaldBm} dBm)</span>",
"tooltip-format-ethernet": "<span color='#${palette.base0C}'></span> <span color='#${palette.base05}'>Ethernet</span>\n<span color='#${palette.base0A}'>Interface:</span> <span color='#${palette.base04}'>{ifname}</span>\n<span color='#${palette.base0A}'>IP:</span> <span color='#${palette.base06}'>{ipaddr}</span>\n<span color='#${palette.base0A}'>IPv6:</span> <span color='#${palette.base04}'>{ipaddr6}</span>\n<span color='#${palette.base0A}'>Gateway:</span> <span color='#${palette.base04}'>{gwaddr}</span>\n<span color='#${palette.base0A}'>Netmask:</span> <span color='#${palette.base04}'>{netmask}</span>",
"tooltip-format-disconnected": "<span color='#${palette.base08}'></span> <span color='#${palette.base08}'>No Connection</span>\n<span color='#${palette.base04}'>Click to refresh network info</span>",
"on-click": "nmcli device wifi rescan && nmcli connection show --active",
"on-click-right": "nmcli device status",
"max-length": 50
},
"cpu": { "format": " {usage}%" },
"memory": { "format": " {used:0.1f}G" },
"temperature": {
"format": "{temperatureC}°C ",
"critical-threshold": 80
},
"battery": {
"format": "{capacity}% {icon}",
"format-icons": ["","","","",""],
"format-charging": "{capacity}% ",
"states": { "warning": 30, "critical": 15 }
},
"power-profiles-daemon": {
"format": "{icon}",
"tooltip-format": "Power profile: {profile}\\nDriver: {driver}",
"tooltip": true,
"format-icons": {
"default": "",
"performance": "",
"balanced": "",
"power-saver": ""
}
},
"clock": {
"format": "{:%H:%M}",
"format-alt": "{:%Y-%m-%d}",
"tooltip": true,
"tooltip-format": "<tt><small>{calendar}</small></tt>",
"calendar": {
"mode": "month",
"mode-mon-col": 3,
"weeks-pos": "right",
"on-scroll": 1,
"format": {
"months": "<span color='#${palette.base05}'><b>{}</b></span>",
"days": "<span color='#${palette.base04}'>{}</span>",
"weeks": "<span color='#${palette.base0C}'><b>W{}</b></span>",
"weekdays": "<span color='#${palette.base0A}'><b>{}</b></span>",
"today": "<span color='#${palette.base08}'><b><u>{}</u></b></span>"
}
},
"actions": {
"on-click-right": "mode",
"on-scroll-up": "shift_up",
"on-scroll-down": "shift_down"
}
},
"tray": {
"spacing": 12
},
"custom/power": {
"format": "",
"tooltip": "exit",
"on-click": "wlogout || wleave"
}
}
'')
];
# CSS style for Waybar
style = ''
* {
/* `otf-font-awesome` is required to be installed for icons */
font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif;
font-size: 13px;
}
/* Base font */
* { font-family: FontAwesome, Roboto, sans-serif; font-size: 13px; }
window#waybar {
background-color: #${palette.base00};
border-bottom: 3px solid #${palette.base03};
color: ${toRGBA palette.base05 "0.7"};
transition-property: background-color;
transition-duration: .5s;
}
/* Bar container */
window#waybar {
background-color: ${toRGBA palette.base00 "0.8"};
border-radius: 12px;
padding: 4px 20px;
border: none;
}
window#waybar.hidden {
opacity: 0.2;
}
/* Workspace margin */
#sway-workspaces,#niri-workspaces { margin-left: 12px; }
/*
window#waybar.empty {
background-color: transparent;
}
window#waybar.solo {
background-color: #${palette.base07};
}
*/
/* Module blocks */
#idle_inhibitor,#backlight,#pulseaudio,#keyboard-state,
#network,#cpu,#memory,#temperature,#battery,
#power-profiles-daemon,#clock,#tray,#custom-power,#custom-launcher,#custom-overview,#niri-window {
background-color: ${toRGBA palette.base01 "0.9"};
border-radius: 8px;
margin: 0 6px;
padding: 0 10px;
border: 1px solid ${toRGBA palette.base03 "0.9"};
}
window#waybar.termite {
background-color: #${palette.base03};
}
/* Hover effect */
#idle_inhibitor:hover,#backlight:hover,#pulseaudio:hover,
#keyboard-state:hover,#network:hover,#cpu:hover,#memory:hover,
#temperature:hover,#battery:hover,#power-profiles-daemon:hover,
#clock:hover,#tray:hover,#custom-power:hover,#custom-launcher:hover,#custom-overview:hover,#niri-window:hover,#niri-workspaces:hover {
background-color: ${toRGBA palette.base02 "0.7"};
}
window#waybar.chromium {
background-color: #${palette.base00};
border: none;
}
/* Tooltip styling */
tooltip {
background-color: ${toRGBA palette.base01 "0.95"};
border: 1px solid ${toRGBA palette.base02 "0.6"};
border-radius: 8px;
color: ${toRGBA palette.base05 "1"};
padding: 8px 12px;
font-size: 12px;
}
tooltip label {
color: ${toRGBA palette.base05 "1"};
}
#clock tooltip {
font-family: monospace;
}
button {
/* Use box-shadow instead of border so the text isn't offset */
box-shadow: inset 0 -3px transparent;
/* Avoid rounded borders under each button name */
border: none;
border-radius: 0;
}
/* Workspace buttons */
#sway-workspaces button,#niri-workspaces button {
padding: 0 6px;
background: transparent;
color: ${toRGBA palette.base05 "1"};
border: none;
border-radius: 6px;
}
#sway-workspaces button:hover,#niri-workspaces button:hover {
background-color: ${toRGBA palette.base02 "0.6"};
}
#sway-workspaces button.focused,#niri-workspaces button.focused {
background-color: ${toRGBA palette.base0D "0.6"};
box-shadow: inset 0 -3px ${toRGBA palette.base0D "0.8"};
}
#sway-workspaces button.urgent,#niri-workspaces button.urgent {
background-color: ${toRGBA palette.base08 "0.7"};
}
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
button:hover {
background: inherit;
box-shadow: inset 0 -3px #${palette.base05};
}
/* Active workspace buttons */
#sway-workspaces button.active,#niri-workspaces button.active {
background-color: ${toRGBA palette.base02 "0.7"};
}
/* you can set a style on hover for any module like this */
#pulseaudio:hover {
background-color: #${palette.base0A};
}
/* Righthand text color */
#clock,#battery,#cpu,#memory,#temperature,#backlight,
#network,#pulseaudio,#tray,#power-profiles-daemon,#custom-power {
color: ${toRGBA palette.base05 "1"};
}
#workspaces button {
padding: 0 5px;
background-color: transparent;
color: #${palette.base05};
}
#workspaces button:hover {
background: #${palette.base00};
}
#workspaces button.focused {
background-color: #${palette.base03};
box-shadow: inset 0 -3px #${palette.base05};
}
#workspaces button.urgent {
background-color: #${palette.base08};
}
#mode {
background-color: #${palette.base03};
box-shadow: inset 0 -3px #${palette.base05};
}
#clock,
#battery,
#cpu,
#memory,
#disk,
#temperature,
#backlight,
#network,
#pulseaudio,
#wireplumber,
#custom-media,
#tray,
#mode,
#idle_inhibitor,
#scratchpad,
#power-profiles-daemon,
#mpd {
padding: 0 10px;
color: #${palette.base05};
}
#window,
#workspaces {
margin: 0 4px;
}
/* If workspaces is the leftmost module, omit left margin */
.modules-left > widget:first-child > #workspaces {
margin-left: 0;
}
/* If workspaces is the rightmost module, omit right margin */
.modules-right > widget:last-child > #workspaces {
margin-right: 0;
}
#clock {
background-color: #${palette.base03};
}
#battery {
background-color: #${palette.base05};
color: #${palette.base00};
}
#battery.charging, #battery.plugged {
color: #${palette.base05};
background-color: #${palette.base0B};
}
@keyframes blink {
to {
background-color: #${palette.base05};
color: #${palette.base00};
}
}
/* Using steps() instead of linear as a timing function to limit cpu usage */
#battery.critical:not(.charging) {
background-color: #${palette.base08};
color: #${palette.base05};
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: steps(12);
animation-iteration-count: infinite;
animation-direction: alternate;
}
#power-profiles-daemon {
padding-right: 15px;
}
/*0b also looked good though. */
#power-profiles-daemon.performance {
background-color: #${palette.base04};
color: #${palette.base00};
}
#power-profiles-daemon.balanced {
background-color: #${palette.base04};
color: #${palette.base00};
}
#power-profiles-daemon.power-saver {
background-color: #${palette.base04};
color: #${palette.base00};
}
label:focus {
background-color: #${palette.base04};
color: #${palette.base00};
}
#cpu {
background-color: #${palette.base04};
color: #${palette.base00};
}
#memory {
background-color: #${palette.base04};
color: #${palette.base00};
}
#disk {
background-color: #${palette.base04};
color: #${palette.base00};
}
#backlight {
background-color: #${palette.base04};
color: #${palette.base00};
}
#network {
background-color: #${palette.base04};
color: #${palette.base00};
}
#network.disconnected {
background-color: #${palette.base0E};
color: #${palette.base00};
}
#pulseaudio {
background-color: #${palette.base0A};
color: #${palette.base00};
}
#pulseaudio.muted {
background-color: #${palette.base0E};
color: #${palette.base03};
}
#wireplumber {
background-color: #${palette.base07};
color: #${palette.base00};
}
#wireplumber.muted {
background-color: #${palette.base0E};
color: #${palette.base00};
}
#custom-media {
background-color: #${palette.base04};
color: #${palette.base00};
min-width: 100px;
}
#custom-media.custom-spotify {
background-color: #${palette.base04};
color: #${palette.base00};
}
#custom-media.custom-vlc {
background-color: #${palette.base04};
color: #${palette.base00};
}
#temperature {
background-color: #${palette.base04};
color: #${palette.base00};
}
#temperature.critical {
background-color: #${palette.base0E};
color: #${palette.base00};
}
#tray {
background-color: #${palette.base04};
color: #${palette.base00};
}
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: #${palette.base07};
color: #${palette.base00};
}
#idle_inhibitor {
background-color: #${palette.base04};
color: #${palette.base00};
}
#idle_inhibitor.activated {
background-color: #${palette.base06};
color: #${palette.base00};
}
#mpd {
background-color: #${palette.base04};
color: #${palette.base00};
}
#mpd.disconnected {
background-color: #${palette.base06};
color: #${palette.base00};
}
#mpd.stopped {
background-color: #${palette.base0C};
}
#mpd.paused {
background-color: #${palette.base0B};
}
#language {
background: #${palette.base04};
color: #${palette.base00};
padding: 0 5px;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state {
background: #${palette.base04};
color: #${palette.base00};
padding: 0 0px;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state > label {
padding: 0 5px;
}
#keyboard-state > label.locked {
background: #${palette.base04};
color: #${palette.base00};
}
#scratchpad {
background: #${palette.base00};
color: #${palette.base00};
}
#scratchpad.empty {
background-color: transparent;
}
#privacy {
padding: 0;
color: #${palette.base04};
}
#privacy-item {
color: #${palette.base00};
padding: 0 5px;
}
#privacy-item.screenshare {
background-color: #${palette.base00};
}
#privacy-item.audio-in {
background-color: #${palette.base0B};
}
#privacy-item.audio-out {
background-color: #${palette.base0D};
}
'';
/* Battery critical blink */
@keyframes blink {
to {
background: ${toRGBA palette.base05 "1"};
color: ${toRGBA palette.base00 "1"};
}
}
#battery.critical:not(.charging) {
animation: blink 0.5s steps(12) infinite alternate;
}
'';
# Keep Waybar alive in your user session
systemd.enable = true;
};
}

69
home/gunalx/wlogout.nix Normal file
View File

@@ -0,0 +1,69 @@
{ pkgs
, lib
, inputs
, config
, nix-colors
, ...
}:
let
# Grab your palette and the hex→RGBA helper
palette = config.colorscheme.palette;
toRGBA = color: alpha:
let rgb = nix-colors.lib.conversions.hexToRGBString "," (lib.removePrefix "#" color);
in "rgba(${rgb},${alpha})";
# Path to the wleave-provided icons
iconsDir = "${pkgs.wleave}/share/wleave/icons";
in
{
programs.wlogout = {
enable = true;
package = pkgs.wlogout;
# Your button layout
layout = [
{ label = "lock"; action = "swaylock"; text = "Lock"; keybind = "l"; }
{ label = "hibernate"; action = "systemctl hibernate"; text = "Hibernate"; keybind = "h"; }
{ label = "logout"; action = "loginctl terminate-user $USER"; text = "Logout"; keybind = "e"; }
{ label = "shutdown"; action = "systemctl poweroff"; text = "Shutdown"; keybind = "s"; }
{ label = "suspend"; action = "systemctl suspend"; text = "Suspend"; keybind = "u"; }
{ label = "reboot"; action = "systemctl reboot"; text = "Reboot"; keybind = "r"; }
];
style = ''
* { background-image: none; }
window {
background-color: ${toRGBA palette.base00 "0.7"};
}
button {
color: #${palette.base0C};
background-color: ${toRGBA palette.base02 "0.8"};
border: 2px solid #${palette.base0C};
border-radius: 1em;
margin: 0.75em;
background-repeat: no-repeat;
background-position: center;
box-shadow: 0 0 4px #${palette.base0C};
padding: 0.6em 1.2em;
}
button:focus,
button:active {
background-color: ${toRGBA palette.base03 "0.9"};
box-shadow: 0 0 6px #${palette.base0C};
outline: none;
}
#lock { background-image: image(url("${iconsDir}/lock.svg")); }
#logout { background-image: image(url("${iconsDir}/logout.svg")); }
#suspend { background-image: image(url("${iconsDir}/suspend.svg")); }
#hibernate { background-image: image(url("${iconsDir}/hibernate.svg")); }
#shutdown { background-image: image(url("${iconsDir}/shutdown.svg")); }
#reboot { background-image: image(url("${iconsDir}/reboot.svg")); }
'';
};
}

View File

@@ -2,19 +2,14 @@
{
imports = [
../common/sshconfig.nix
../common/unfree.nix
../common/nix.nix
../common/atuin.nix
];
programs.nix-index = {
enable = true;
};
nixpkgs = {
config = {
allowUnfree = true;
allowUnfreePredicate = (_: true);
};
};
programs.bash = {
enable = true;

View File

@@ -1,33 +0,0 @@
{ pkgs, lib, ... }:
{
home.packages = with pkgs; [
nerdfonts
noto-fonts
noto-fonts-cjk
noto-fonts-emoji
liberation_ttf
fira-code
fira-code-symbols
nerdfonts
ubuntu_font_family
zpix-pixel-font
_0xproto
font-awesome
font-awesome_5
font-awesome_4
];
fonts.fontconfig.enable = true;
fonts.fontconfig.defaultFonts = {
emoji = ["noto-fonts-emoji font-awesome"];
monospace = ["0xproto" "zpix" "fira-code"];
serif = [ "Noto Serif" "Source Han Serif" ];
sansSerif = [ "Noto Sans" "Source Han Sans" ];
};
}

View File

@@ -20,6 +20,7 @@
#customised applications
../../services/podman.nix
../../services/boinc.nix
../../services/ollama-amd.nix
];
# Bootloader.
@@ -53,15 +54,7 @@
# Enable the X11 windowing system.
services.xserver.enable = true;
services.xserver.videoDrivers = [ "amdgpu" ];
hardware.opengl.extraPackages = with pkgs; [
rocm-opencl-icd
rocm-opencl-runtime
amdvlk
];
hardware.opengl.driSupport = true;
# For 32 bit applications
hardware.opengl.driSupport32Bit = true;
# Enable touchpad support (enabled default in most desktopManager).
# services.xserver.libinput.enable = true;
@@ -70,7 +63,7 @@
users.users.gunalx = {
isNormalUser = true;
description = "Adrian Gunnar Lauterer";
extraGroups = [ "networkmanager" "wheel" ];
extraGroups = [ "networkmanager" "wheel" "input" ];
packages = with pkgs; [
];
};
@@ -97,7 +90,7 @@
#basic programming
kate
kdePackages.kate
vscode-fhs
gcc
gpp
@@ -124,7 +117,7 @@
ollama
rpi-imager
prismlauncher
cura
#cura #seems broken dependencies.
prusa-slicer
openscad

View File

@@ -13,24 +13,48 @@
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
hardware.amdgpu.opencl.enable = true;
hardware.amdgpu.amdvlk.enable = true;
boot.kernelPackages = pkgs.linuxPackages_latest;
hardware.graphics = {
enable = true;
};
services.xserver.videoDrivers = [ "amdgpu" ];
systemd.tmpfiles.rules = [
"L+ /opt/rocm/hip - - - - ${pkgs.rocmPackages.clr}"
];
hardware.opengl.extraPackages = with pkgs; [
rocmPackages.clr.icd
#amdvlk
libva-utils
];
nixpkgs.config.rocmSupport = true;
environment.variables = {
HSA_OVERRIDE_GFX_VERSION="10.3.0";
};
#hardware.opengl.extraPackages32 = with pkgs; [
# driversi686Linux.amdvlk
#];
hardware.opengl.driSupport = true; # This is already enabled by default
hardware.opengl.driSupport32Bit = true; # For 32 bit applications
environment.systemPackages = with pkgs; [
lact
rocmPackages.rocminfo
rocmPackages.rocm-smi
rocmPackages.rocm-runtime
rocmPackages.rocm-device-libs
rocmPackages.rocm-core
rocmPackages.rocm-cmake
rocmPackages.rocgdb
rocmPackages.rocblas
rocmPackages.rccl
];
systemd.packages = with pkgs; [ lact ];
systemd.services.lactd.wantedBy = ["multi-user.target"];
fileSystems."/" =

View File

@@ -10,6 +10,7 @@
../../profiles/webhost.nix
../../profiles/base.nix
#../../services/ozai.nix
#../../services/ollamaWebui.nix
./routes.nix
];
@@ -37,7 +38,6 @@
wget
tailscale
config.services.headscale.package
kanidm
];
users.users.gunalx = { # Define a user account. Don't forget to set a password with passwd.

View File

@@ -81,14 +81,22 @@
basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
};
virtualHosts."jupyter.lauterer.it" = {
forceSSL = true;
useACMEHost = config.networking.domain;
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://100.84.215.84:8771";
};
#basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
};
virtualHosts."rss.lauterer.it" = {
forceSSL = true;
useACMEHost = config.networking.domain;
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://100.84.215.84:8081";
proxyPass = "http://100.84.215.84:8089";
};
#basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
};
@@ -105,6 +113,20 @@
};
virtualHosts."chat.lauterer.it" = {
forceSSL = true;
useACMEHost = config.networking.domain;
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://100.84.215.84:11111";
};
#basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
};
#virtualHosts."azul.256.no" = {
# forceSSL = true;
# useACMEHost = config.networking.domain;

View File

@@ -19,12 +19,15 @@
../../profiles/mediaserver.nix
#../../services/smb.nix
../../services/wordpress.nix
#../../services/wordpress.nix # lets not
../../services/bitwarden.nix
../../services/torrent.nix
../../services/jupyterhub.nix
#../../services/ozai.nix
#../../services/stableDiffusion.nix
../../services/rss.nix
../../services/shiori.nix
../../services/mealie.nix
];
# Bootloader.

View File

@@ -10,6 +10,10 @@
allowUnfree = true;
cudaSupport = true;
};
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
"cuda_cudart"
];
# Load nvidia driver for Xorg and Wayland
services.xserver.videoDrivers = ["nvidia"];
@@ -38,9 +42,9 @@
cudaPackages.cudatoolkit
cudaPackages.cudnn
nvtopPackages.nvidia
gcc
#gcc
cudaPackages.nccl
cmake
#cmake
#llama-cpp
#python3Packages.pip
#cudaPackages.cuda_cudart
@@ -54,8 +58,5 @@
];
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
"cuda_cudart"
];
}

View File

@@ -20,9 +20,9 @@
'';
packages.myplugins = with pkgs.vimPlugins; {
start = [
vim-nix
vim-lastplace
vim-yaml
vim-nix
#vim-lastplace
#vim-yaml
#coc-rust-analyzer
#neovim-fuzzy
#LanguageClient-neovim

View File

@@ -1,4 +1,7 @@
{ config, pkgs, lib, ... }:
let
mkDefault = lib.mkDefault;
in
{
imports =
[
@@ -16,23 +19,27 @@ imports =
wget
rsync
ripgrep
neofetch
htop
#neofetch
#htop
bottom
killall
foot.terminfo
tailscale
sops
atuin
#upower
];
#just allow unfree, im fine with it.
nixpkgs.config.allowUnfree = true;
zramSwap = {
zramSwap = mkDefault {
enable = true;
memoryPercent = 25;
};
#boot.plymouth.enable = true;
# Set your time zone.
time.timeZone = "Europe/Oslo";
@@ -41,7 +48,7 @@ imports =
i18n.defaultLocale = "en_US.UTF-8";
# Configure console
console = {
console = mkDefault {
font = "Lat2-Terminus16";
keyMap = "no";
};
@@ -68,19 +75,59 @@ imports =
dc="cd";
la="ls -la";
lls="ls";
};
environment.interactiveShellInit = ''
alias gst='git status'
alias gcm='git commit -m'
alias gca='git commit --amend'
alias gsw='git switch'
alias gaa='git add -A'
alias gb='git branch'
alias dc='cd'
alias la='ls -la'
alias lls='ls'
battery="upower -i $(upower -e | grep 'BAT') | grep -E 'state|to full|percentage'";
cim="vim";
cbuild="mkdir build && cd build && cmake .. && make";
untar="tar -xvf";
};
environment.interactiveShellInit = ''
#atuin import auto
# Colors
RESET='\[\e[0m\]'
BOLD='\[\e[1m\]'
CYAN='\[\e[36m\]'
GREEN='\[\e[32m\]'
BLUE='\[\e[34m\]'
YELLOW='\[\e[33m\]'
MAGENTA='\[\e[35m\]'
RED='\[\e[31m\]'
if [[ -n "$SSH_CONNECTION" ]]; then
REMOTE_LABEL="\[''${YELLOW}\] (ssh)\[''${RESET}\]"
else
REMOTE_LABEL=""
fi
# Git branch function
parse_git_branch() {
git branch --show-current 2>/dev/null | awk '{print " (" $1 ")"}'
}
# Set prompt
if [[ $EUID -eq 0 ]]; then
PS1="''${BOLD}''${RED}\u''${RESET}:''${BOLD}''${RED}\h''${REMOTE_LABEL}''${RESET}:''${BOLD}''${GREEN}\w''${MAGENTA}\$(parse_git_branch) ''${BLUE}\A''${RESET}\$ "
else
PS1="''${BOLD}''${CYAN}\u''${RESET}:''${BOLD}''${CYAN}\h''${REMOTE_LABEL}''${RESET}:''${BOLD}''${GREEN}\w''${MAGENTA}\$(parse_git_branch) ''${BLUE}\A''${RESET}\$ "
fi
'';
# environment.interactiveShellInit = ''
# alias gst='git status'
# alias gcm='git commit -m'
# alias gca='git commit --amend'
# alias gsw='git switch'
# alias gaa='git add -A'
# alias gb='git branch'
# alias dc='cd'
# alias la='ls -la'
# alias lls='ls'
# '';
#
## some insecure packages
nixpkgs.config.permittedInsecurePackages = [
@@ -94,9 +141,9 @@ imports =
};
#nix stuff
nix.gc.automatic = true;
nix.gc.automatic = mkDefault true;
nix = {
extraOptions = ''
extraOptions = mkDefault ''
builders-use-substitutes = true
experimental-features = nix-command flakes impure-derivations ca-derivations
!include ${config.sops.secrets."github/api".path}
@@ -123,23 +170,7 @@ imports =
};
buildMachines = [
# { hostName = "bob.pvv.ntnu.no";
# system = "x86_64-linux";
# maxJobs = 12;
# supportedFeatures = [ "big-parallel" ];
# speedFactor = 129270;
# }
{ hostName = "bolle.pbsds.net";
system = "x86_64-linux";
maxJobs = 6;
speedFactor = 12857;
}
{ hostName = "garp.pbsds.net";
system = "x86_64-linux";
maxJobs = 4;
# i7-6700
speedFactor = 8088;
}
{ hostName = "aragon";
system = "x86_64-linux";
# if the builder supports building for multiple architectures,
@@ -159,7 +190,15 @@ imports =
supportedFeatures = [ "cuda" ];
mandatoryFeatures = [ ];
}
# {
{ hostName = "localhost";
system = "x86_64-linux";
maxJobs = 4;
#speedFactor = 8066;
speedFactor = 2000;
supportedFeatures = [ ];
mandatoryFeatures = [ ];
}
# {
# hostName = "isvegg.pvv.ntnu.no";
# system = "x86_64-linux";
# maxJobs = 4;
@@ -176,9 +215,8 @@ imports =
enable = true;
flake = "git+https://github.com/adrlau/nix-dotfiles.git";
flags = [
"--update-input" "nixpkgs"
"--update-input" "nixpkgs-unstable"
"--no-write-lock-file"
"-L"
];
};

View File

@@ -13,21 +13,27 @@ imports =
];
environment.systemPackages = with pkgs; [
openscad
cura
environment.systemPackages = with pkgs; [
libnotify
openscad
#cura # broken
prusa-slicer
#libsForQt5.qt5ct
#qt6Packages.qt6ct
where-is-my-sddm-theme
swww
#libsForQt5.qt5ct
#qt6Packages.qt6ct
where-is-my-sddm-theme
swww
nvtopPackages.full
];
fonts.packages = with pkgs; [
nerd-fonts._0xproto
_0xproto
noto-fonts
noto-fonts-cjk
noto-fonts-cjk-sans
noto-fonts-emoji
liberation_ttf
fira-code
@@ -35,10 +41,11 @@ imports =
mplus-outline-fonts.githubRelease
dina-font
proggyfonts
nerdfonts
#nerdfonts
ubuntu_font_family
];
] ++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts);
# Enable CUPS to print documents.
services.printing.enable = false; #temp off because of CVE
@@ -52,26 +59,16 @@ imports =
#security.pam.services.display-manager.ly = {};
services.displayManager = {
enable = true;
sessionPackages = with pkgs; [ sway ];
sessionPackages = with pkgs; [ sway niri];
sddm = {
enable = true;
autoNumlock = true;
};
### still really broken and neds 24.11
#ly = {
# package = pkgs.unstable.ly;
# enable = true;
# settings = {
# animation = "matrix";
# waylandsessions = "${config.services.displayManager.sessionData.desktops}/share/wayland-sessions";
# };
#};
};
services.power-profiles-daemon.enable = true;
services.logind.powerKey = "ignore";

View File

@@ -8,6 +8,15 @@ imports =
];
environment.systemPackages = with pkgs; [
zed-editor-fhs
aider-chat
python3Full
uv
python3Packages.pip
python3Packages.uv
poetry
texliveFull

View File

@@ -3,7 +3,7 @@
imports =
[
./base.nix
../services/podgrab.nix
#../services/podgrab.nix # not maintained
../services/jellyfin.nix
];

View File

@@ -7,8 +7,7 @@ imports =
];
sound.enable = true;
hardware.pulseaudio.enable = false;
services.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
@@ -35,7 +34,7 @@ imports =
vital
picoloop
#bespokesynth-with-vst2 #always takes ages compiling
fmsynth
#fmsynth
polyphone #soundfont editor
#vocaloids
@@ -61,7 +60,8 @@ imports =
headset
nuclear
spotifyd
spotify-qt
spotify-player
spotify
spotify-tray
tenacity

View File

@@ -41,7 +41,7 @@ imports =
workstyle
#swayest-workstyle #migth switch to this.
autotiling-rs
wleave
wlogout
pass-wayland
@@ -49,7 +49,7 @@ imports =
fonts.packages = with pkgs; [
noto-fonts
noto-fonts-cjk
noto-fonts-cjk-sans
noto-fonts-emoji
liberation_ttf
fira-code

View File

@@ -10,6 +10,8 @@ qbittorrent:
interfaceAddress: ENC[AES256_GCM,data:GsDv+UB07bQGh/DISw==,iv:Hn1zGJweLj5jy8sk4aN9rob/6kfzo7iLXPgaLBIMSVs=,tag:fbKSrAIOqTsnCCI1DBUZkA==,type:str]
miniflux:
adminCredentialsFile: ENC[AES256_GCM,data:FPcdTiJqbI6MloU9JqAYPABoD/odegXks+JyEeCri8hOV0dPMd0TNDV8fN1bbIiJ4llzaclZbjl0HKM=,iv:5fd3O008aP34+7lGlG8vBPAIdmEjFPoneH+rJ6d9TI0=,tag:HKOHjGLiAIDBR54HJv9teA==,type:str]
vaultwarden:
environmentFile: ENC[AES256_GCM,data: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,iv:jSlHx+PODfAcsYTZOju5z8mawPXAV+TKvj89nrdCYkE=,tag:j+4gdsBV4COe/FduaejI2A==,type:str]
openvpn:
galadriel:
config: ENC[AES256_GCM,data:f9uDYNLHP63oee5lGMPsmZ76f80n51eYxd3hvF5ZhPGtCspBEOMLHRonTSEril1wKCT3i1DWR967lWTdjJs6KOpoX5JqKz2Qj9tkpXS5jnHZAf0JQg1l7jmf9/a2OKJparVCFJyNPTN5mzl3gGOyDGe0TIT+ZtP8/PCWsQNjB89Crd/kHSSAmIUb2fcNXEkxs6XwgsBAlhbR69e+06NYaRyX5ydVV/kDekx+ixpx2bIqMQqIdEk358RLCauP3wAh1FoqTTJ2eqLcDhuPySFol9cLCInWnColNdyb/0+czrEa4DiLrbFVXx7bUVwjd9rb+eoajC1e09d41aJkVHG1LxlSRjq1sBlI3v3E1vaUBJWegZBROEpqEOCKfHSagkmaanaBv/KMq1MFmXJ1MzyskDJb9MdNFKRQBjQLwBXnURts/Yj9ChrT51z+/bwItxt8XmlwIEgL65F/8h1+bUJGOi27ZAvfkixflff0ELYSPvQI+N1vFlF9QP6AmIFxF2SdmOSlYzTYIz0+LMejLltCEUdU2qdlZ0a9DuYlsxvnZ75JgWXviw==,iv:C2Zb1DLTMlsEqQ5/UUrpT9k5Z51YYGu3SUcu1F20ydc=,tag:wGkQ7LWgCfy0K3zM38JxHQ==,type:str]
@@ -18,10 +20,6 @@ openvpn:
userkey: ENC[AES256_GCM,data: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,iv:kR5g0wvCQ3NGAqviN1jvqscgAYrGzHLqhooIljtJ+gg=,tag:Z+U5Wn4U5ADIxjdfI37cBA==,type:str]
tlscrypt: ENC[AES256_GCM,data:zG12fAsc9/LcxO0eGx4ytjHm07BMnf5aBHlfTtif4noCXcPAx5xunhJCOaWEoTobwOEpdgXoZzQcJa7EW6N/4kEnGzk8gfSl+BFswO6LEoqzYJb4sfy2qJJQrjUNxsI9yib+OCgb4DQ94apdvVG/dVypdMQrw+x+xg8K+hdZ5LZWdZLKKcBxHKeHoZ+lt/gJNv3BbtQP6Vy+1biWxjdHy1YfvLm+iqaJfi3/9HV8YAi/iePoY+rNNtc8GlaUp/HrHfmCFF4EBWuFr2knQ5t8bx7sHGlhdcTIyHJwNQdCUIsyVqckhxDulLM8luuGJZsiulkdK2f4NSpa6CPYZPWPHQ2BfSnugBEjbWrF2RQT3eOLAEJBS9YSV1/nvHA/lU2ymf0PBzzXhE9Ms0twecrS8Ql/qRbWSqiQNzHv/P7k5i5E8iw4zqaUtir7gpu3AkC2GxMVuQfowiruZGPi6i2YbDzgaBi5fZJAosWQHvZXnVApqFqzWXCzw4ACXlMI6MZ1rb3Ut9wEDXHGMRhhcWmHDsCO6I4/EphDfLiexYeVHKB++MLilXaUa6wXN0yGefj+NC3Am5YQRwR3rd4KrjXOrbKWELoIkyYrGWkZ5w5O5fC4Z+h8jxPjng/lNM3JAzREgKcw+0IcY5q3/bRXWGMScVm5qqc9LXozhWU9gghQOhbcb4NYFob8yczTJT8IdA6D72N4pAm+524DMjTPRiAi1KQInICeZp2mILvT5aUgTEXtj+iwyqyo+io3ffOjQdHa9HU2IrZKmoapkvEOsFHm3L63uY1T92/Han8=,iv:cjIKuwyLtXT5Wg/VzinC2Lf5EysoxsgnEsHei/+Yum8=,tag:b5LKO8urIBC7BJgyfs5kWw==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- recipient: age14cpm59h7hx8gr54hrn4uxu4xnrp9wy3f2kdxvy6xwuyxsfg8g9zs8z5e77
enc: |
@@ -32,8 +30,7 @@ sops:
OHNBdXMzZTN0VEVTYkVSbUVRYmo3eUUKvRiPgmrCCK1F5QoSHlV89C2MPl5FvU5i
z61NMJu68UEDsDu8qNRaW3aqpT+1GYsr1evi5imzNwr0qTM2oRwkFQ==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2024-11-15T01:14:16Z"
mac: ENC[AES256_GCM,data:4hqXQvlmPKuPkQEcUIpTEUudVknNVNjXjP8pB2UPnPmnr79nLWy/ZOzAcpSob1XNHyB7We5neBUEDYO56PjOM9C022XdZfaqXUC931uqLqo1iLQupApCphf/HR5bwDayv63Mr1Ys9MBdhCrYtlfy4iPiEdlpfDhLuD268EM8x0w=,iv:rgzgkB+5r/xDrN4i8O1f6CXyGxF7Peo+24kkQf96yf4=,tag:TZPaNEEYxFZ0m1CRbPQ0kA==,type:str]
pgp: []
lastmodified: "2025-09-28T20:50:07Z"
mac: ENC[AES256_GCM,data:RL8OmwcGAfFC/x5MZq6zC+wlLoyyma+ZTK5uq4Qe80SJlAJP8Sep1zp82fCuBe2ogl7h0UjrBcpOtwOPxoEs7ez2qaDpHyhmK+IFahvnLiodoP95JCSgpHLhTPK3Fxt3bPhO6T52HoLq/coiKO8YQhRdMPtat9+KF0SbcrH1uAE=,iv:tsieRtJTf00Haa8Elc+CyWB73qiMChLY1SC6HMVC84s=,tag:f+jjKdYfmr/ef/FJbCU1Dg==,type:str]
unencrypted_suffix: _unencrypted
version: 3.8.1
version: 3.10.2

24
services/bitwarden.nix Normal file
View File

@@ -0,0 +1,24 @@
{ config, pkgs, lib, ... }:
{
# environment.systemPackages = [
# pkgs.sendmail
# ];
sops.secrets."vaultwarden/environmentFile" = {
restartUnits = [ "vaultwarden.service" ];
owner = "vaultwarden";
mode = "0755";
};
services.vaultwarden = {
enable = true;
environmentFile = config.sops.secrets."vaultwarden/environmentFile".path;
dbBackend = "sqlite";
backupDir = "/var/backup/vaultwarden";
};
}

99
services/jupyterhub.nix Normal file
View File

@@ -0,0 +1,99 @@
{ config, pkgs, lib, ... }:
let
myPython = pkgs.python3;
myJupyterHubEnv = myPython.withPackages (ps: with ps; [
jupyterhub
jupyterhub-systemdspawner
ipython
jupyterlab
notebook
ipykernel
numpy
scipy
pandas
matplotlib
seaborn
scikit-learn
]);
myJupyterLabEnv = myPython.withPackages (ps: with ps; [
jupyterhub
jupyterlab
ipykernel
numpy
scipy
pandas
matplotlib
seaborn
scikit-learn
]);
in
{
environment.systemPackages = with pkgs; [
python3Packages.numpy
python3Packages.scipy
python3Packages.pandas
python3Packages.matplotlib
python3Packages.seaborn
python3Packages.scikit-learn
];
users.users.tdt4117 = {
isNormalUser = true;
home = "/home/tdt4117";
description = "Alice Foobar";
extraGroups = [ ];
# openssh.authorizedKeys.keys = [ "ssh-dss AAAAB3Nza... " ];
};
services.jupyterhub = {
jupyterhubEnv = myJupyterHubEnv;
jupyterlabEnv = myJupyterLabEnv;
enable = true;
port = 8770;
host = "0.0.0.0";
extraConfig = ''
c.Authenticator.allow_all = True
c.ConfigurableHTTPProxy.api_url = 'http://0.0.0.0:8770'
c.JupyterHub.bind_url = 'http://0.0.0.0:8771'
'';
kernels = {
python3 = let
env = (pkgs.python3.withPackages (pythonPackages: with pythonPackages; [
ipykernel
pandas
scikit-learn
seaborn
pandas
huggingface-hub
datasets
matplotlib
tqdm
numpy
scipy
]));
in {
displayName = "Python 3 for machine learning";
argv = [
"${env.interpreter}"
"-m"
"ipykernel_launcher"
"-f"
"{connection_file}"
];
language = "python";
logo32 = "${env}/${env.sitePackages}/ipykernel/resources/logo-32x32.png";
logo64 = "${env}/${env.sitePackages}/ipykernel/resources/logo-64x64.png";
};
};
};
}

11
services/mealie.nix Normal file
View File

@@ -0,0 +1,11 @@
{ config, pkgs, lib, ... }:
{
services.mealie = {
enable = true;
settings = {
ALLOW_SIGNUP = "true";
};
database.createLocally = true;
};
}

54
services/ollama-amd.nix Normal file
View File

@@ -0,0 +1,54 @@
{ config, pkgs, lib, ... }:
{
# Add Ollama to system packages
environment.systemPackages = [ pkgs.unstable.ollama ];
# Ollama configuration
services.ollama = {
enable = true;
package = pkgs.unstable.ollama;
host = "0.0.0.0";
openFirewall = true;
port = 11434;
home = "/var/lib/ollama";
# Preloaded models
loadModels = [
"gemma3:1b"
"qwen3:8b"
"qwen3:0.6b"
"llama3.1"
"moondream"
"minicpm-v"
"qwen2.5vl:3b"
"gemma3:4b"
"granite3.2-vision"
"zylonai/multilingual-e5-large"
"nomic-embed-text"
"snowflake-arctic-embed2"
];
# Environment variables based on hostname
environmentVariables = {
"HIP_VISIBLE_DEVICES" = "0,1";
"OLLAMA_LLM_LIBRARY" = "rocm";
};
rocmOverrideGfx = "10.3.0"; #rdna2
# Acceleration settings
acceleration = "rocm";
};
# NGINX reverse proxy configuration
services.nginx.virtualHosts."ollama.${config.networking.hostName}.${config.networking.domain}" = {
forceSSL = true;
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://${config.services.ollama.listenAddress}";
};
basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
};
}

View File

@@ -1,54 +1,45 @@
{ config, pkgs, lib, ... }:
let
hostname = config.networking.hostName;
in
{
environment.systemPackages = [
pkgs.unstable.ollama
];
# Add Ollama to system packages
environment.systemPackages = [ pkgs.unstable.ollama ];
# Ollama configuration
services.ollama = {
enable = true;
package = pkgs.unstable.ollama;
host = "0.0.0.0";
openFirewall = true;
port = 11434;
home = "/var/lib/ollama";
enable = true;
package = pkgs.unstable.ollama;
host = "0.0.0.0";
openFirewall = true;
port = 11434;
home = "/var/lib/ollama";
loadModels = [
"llama3.2"
"gemma2:2b"
"qwen2.5:3b"
# Preloaded models
loadModels = [
"gemma3:1b"
"qwen3:latest"
"qwen3:4b"
"qwen3:0.6b"
"gemma3:4b"
"qwen2.5vl:3b"
"granite3.2-vision"
"gpt-oss:20b"
];
"llama3.2-vision"
"llava-phi3"
"llava-llama3"
"moondream"
"minicpm-v"
# Acceleration settings
acceleration = "cuda";
"llama3.1"
"mistral-nemo"
"phi4"
"zylonai/multilingual-e5-large"
"nomic-embed-text"
"snowflake-arctic-embed"
];
};
#possibly a flawed idea, should just set cudaSupport and rocm support.
services.ollama.acceleration = lib.mkDefault ( let
hostname = config.networking.hostName;
in
if hostname == "galadriel" then "cuda"
else if hostname == "aragorn" then "rocm"
else null);
# NGINX reverse proxy configuration
services.nginx.virtualHosts."ollama.${config.networking.hostName}.${config.networking.domain}" = {
forceSSL = true;
#useACMEHost = config.networking.domain; #not sure if this will work, unless
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://${config.services.ollama.listenAddress}";
};
basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
forceSSL = true;
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://${config.services.ollama.listenAddress}";
};
basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
};
}

View File

@@ -1,18 +1,22 @@
{ config, pkgs, lib, ... }:
{
environment.systemPackages = [
pkgs.unstable.open-webui
pkgs.gvisor
#pkgs.open-webui
#pkgs.unstable.open-webui #needed stable one to hoefulle be able to take a backup from ui.
pkgs.bash
pkgs.ffmpeg
# pkgs.unstable.tika
];
services.tika = {
enable=true;
openFirewall=true;
listenAddress = "localhost";
enableOcr = true;
};
# services.tika = {
# enable=true;
# package = pkgs.unstable.tika;
# openFirewall=true;
# listenAddress = "0.0.0.0";
# port = 9998;
# enableOcr = true;
# };
services.open-webui = {
enable = true;
@@ -21,12 +25,22 @@
port = 11111;
host = "0.0.0.0";
openFirewall = true;
stateDir = "/var/lib/open-webui";
environment = {
ANONYMIZED_TELEMETRY = "False";
DO_NOT_TRACK = "True";
SCARF_NO_ANALYTICS = "True";
PDF_EXTRACT_IMAGES = "False";
FRONTEND_BUILD_DIR = "${config.services.open-webui.stateDir}/build";
DATA_DIR = "${config.services.open-webui.stateDir}/data";
STATIC_DIR = "${config.services.open-webui.stateDir}/static";
WEBUI_AUTH = "True";
#ENABLE_SIGNUP = "True";
ENABLE_SIGNUP_PASSWORD_CONFIRMATION = "True";
#DEFAULT_USER_ROLE = "admin";
ENV = "prod";
};
};

View File

@@ -0,0 +1,139 @@
{ config, lib, pkgs, ... }:
let
port = 8090;
torrentPort = 44183;
savePath = "/Main/Data/media/Downloads/";
path = "/var/lib/qbittorrent";
configurationFile = ''
[Application]
FileLogger\Age=1
FileLogger\AgeType=1
FileLogger\Backup=true
FileLogger\DeleteOld=true
FileLogger\Enabled=true
FileLogger\MaxSizeBytes=66560
FileLogger\Path=/Main/Data/media/.qbittorrent/logs
MemoryWorkingSetLimit=8192
[BitTorrent]
Session\AddExtensionToIncompleteFiles=true
Session\AlternativeGlobalDLSpeedLimit=1000
Session\AlternativeGlobalUPSpeedLimit=1000
Session\AnonymousModeEnabled=false
Session\BTProtocol=Both
Session\BandwidthSchedulerEnabled=false
Session\DefaultSavePath=/Main/Data/media/Downloads
Session\Encryption=1
Session\ExcludedFileNames=
Session\FinishedTorrentExportDirectory=/Main/Data/media/Downloads/torrents-complete
Session\GlobalDLSpeedLimit=0
Session\GlobalMaxRatio=1.5
Session\GlobalUPSpeedLimit=0
Session\I2P\Enabled=true
Session\IgnoreLimitsOnLAN=true
Session\IncludeOverheadInLimits=true
Session\Interface=tun0
Session\InterfaceAddress=${config.sops.placeholder."qbittorrent/interfaceAddress"}
Session\InterfaceName=tun0
Session\LSDEnabled=true
Session\MaxActiveCheckingTorrents=15
Session\MaxRatioAction=1
Session\Port=44183
Session\Preallocation=true
Session\QueueingSystemEnabled=false
Session\SubcategoriesEnabled=true
Session\Tags=movie, anime
Session\TempPath=/Main/Data/media/Downloads/temp
Session\TempPathEnabled=true
Session\TorrentContentLayout=Subfolder
Session\TorrentExportDirectory=/Main/Data/media/Downloads/torrents
Session\UseAlternativeGlobalSpeedLimit=false
[Core]
AutoDeleteAddedTorrentFile=Never
[LegalNotice]
Accepted=true
[Meta]
MigrationVersion=6
[Network]
PortForwardingEnabled=true
[Preferences]
General\Locale=en
MailNotification\req_auth=true
Scheduler\days=Weekday
Scheduler\end_time=@Variant(\0\0\0\xf\x5%q\xa0)
WebUI\AuthSubnetWhitelist=192.168.1.0/24, 100.0.0.0/8
WebUI\AuthSubnetWhitelistEnabled=true
WebUI\Port=${toString port}
WebUI\UseUPnP=false
[RSS]
AutoDownloader\DownloadRepacks=true
AutoDownloader\EnableProcessing=true
AutoDownloader\SmartEpisodeFilter=s(\\d+)e(\\d+), (\\d+)x(\\d+), "(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", "(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})"
Session\EnableProcessing=true
'';
in
{
imports = [
../profiles/sops.nix
];
networking.firewall.allowedTCPPorts = [ port torrentPort];
networking.firewall.allowedUDPPorts = [ port torrentPort];
sops.secrets."qbittorrent/interfaceAddress" = {
restartUnits = [ "qbittorrent-nox.service" ];
owner = "qbittorrent";
mode = "0755";
};
sops.templates."qbittorrent/configuration" = {
content = configurationFile;
#path = "${path}/.config/qBittorrent/qBittorrent.conf"; #did not seem to work
owner = "qbittorrent";
mode = "0755";
};
users.users.qbittorrent = {
isNormalUser = true; #make this a normal user to be able to make files
home = path;
group = "media";
};
users.groups.qbittorrent = {};
systemd.services."qbittorrent-nox" = {
after = [ "network.target" ];
wants = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStartPre = "${pkgs.bash}/bin/bash -c '${pkgs.coreutils}/bin/mkdir -p ${path} && ${pkgs.coreutils}/bin/chmod -R 755 ${path} && ${pkgs.coreutils}/bin/cp ${config.sops.templates."qbittorrent/configuration".path} ${path}/.config/qBittorrent/qBittorrent.conf'";
ExecStart = "${pkgs.unstable.qbittorrent-nox}/bin/qbittorrent-nox";
User = "qbittorrent";
Group = "media";
Restart = "on-failure";
ProtectKernelModules = true;
NoNewPrivileges = true;
};
};
services.nginx.virtualHosts."qbittorrent.${config.networking.hostName}.${config.networking.domain}" = {
forceSSL = true;
#useACMEHost = config.networking.domain; #not sure if this will work, unless
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://localhost:${port}";
};
basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
};
}

View File

@@ -18,7 +18,7 @@
services.miniflux.enable = true;
services.miniflux.config.LISTEN_ADDR = "0.0.0.0:8081";
services.miniflux.config.LISTEN_ADDR = "0.0.0.0:8089";
services.miniflux.adminCredentialsFile = config.sops.secrets."miniflux/adminCredentialsFile".path;
}

View File

@@ -1,85 +1,6 @@
{ config, lib, pkgs, ... }:
let
port = 8090;
torrentPort = 44183;
savePath = "/Main/Data/media/Downloads/";
path = "/var/lib/qbittorrent";
configurationFile = ''
[Application]
FileLogger\Age=1
FileLogger\AgeType=1
FileLogger\Backup=true
FileLogger\DeleteOld=true
FileLogger\Enabled=true
FileLogger\MaxSizeBytes=66560
FileLogger\Path=/Main/Data/media/.qbittorrent/logs
MemoryWorkingSetLimit=8192
[BitTorrent]
Session\AddExtensionToIncompleteFiles=true
Session\AlternativeGlobalDLSpeedLimit=1000
Session\AlternativeGlobalUPSpeedLimit=1000
Session\AnonymousModeEnabled=false
Session\BTProtocol=Both
Session\BandwidthSchedulerEnabled=false
Session\DefaultSavePath=/Main/Data/media/Downloads
Session\Encryption=1
Session\ExcludedFileNames=
Session\FinishedTorrentExportDirectory=/Main/Data/media/Downloads/torrents-complete
Session\GlobalDLSpeedLimit=0
Session\GlobalMaxRatio=1.5
Session\GlobalUPSpeedLimit=0
Session\I2P\Enabled=true
Session\IgnoreLimitsOnLAN=true
Session\IncludeOverheadInLimits=true
Session\Interface=tun0
Session\InterfaceAddress=${config.sops.placeholder."qbittorrent/interfaceAddress"}
Session\InterfaceName=tun0
Session\LSDEnabled=true
Session\MaxActiveCheckingTorrents=15
Session\MaxRatioAction=1
Session\Port=44183
Session\Preallocation=true
Session\QueueingSystemEnabled=false
Session\SubcategoriesEnabled=true
Session\Tags=movie, anime
Session\TempPath=/Main/Data/media/Downloads/temp
Session\TempPathEnabled=true
Session\TorrentContentLayout=Subfolder
Session\TorrentExportDirectory=/Main/Data/media/Downloads/torrents
Session\UseAlternativeGlobalSpeedLimit=false
[Core]
AutoDeleteAddedTorrentFile=Never
[LegalNotice]
Accepted=true
[Meta]
MigrationVersion=6
[Network]
PortForwardingEnabled=true
[Preferences]
General\Locale=en
MailNotification\req_auth=true
Scheduler\days=Weekday
Scheduler\end_time=@Variant(\0\0\0\xf\x5%q\xa0)
WebUI\AuthSubnetWhitelist=192.168.1.0/24, 100.0.0.0/8
WebUI\AuthSubnetWhitelistEnabled=true
WebUI\Port=${toString port}
WebUI\UseUPnP=false
[RSS]
AutoDownloader\DownloadRepacks=true
AutoDownloader\EnableProcessing=true
AutoDownloader\SmartEpisodeFilter=s(\\d+)e(\\d+), (\\d+)x(\\d+), "(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", "(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})"
Session\EnableProcessing=true
'';
interfaceaddress = builtins.readFile config.sops.secrets."qbittorrent/interfaceAddress".path;
in
{
@@ -87,8 +8,6 @@ in
../profiles/sops.nix
];
networking.firewall.allowedTCPPorts = [ port torrentPort];
networking.firewall.allowedUDPPorts = [ port torrentPort];
sops.secrets."qbittorrent/interfaceAddress" = {
restartUnits = [ "qbittorrent-nox.service" ];
@@ -96,44 +15,87 @@ in
mode = "0755";
};
sops.templates."qbittorrent/configuration" = {
content = configurationFile;
#path = "${path}/.config/qBittorrent/qBittorrent.conf"; #did not seem to work
owner = "qbittorrent";
mode = "0755";
};
users.users.qbittorrent = {
isNormalUser = true; #make this a normal user to be able to make files
home = path;
group = "media";
group = lib.mkForce "media";
};
users.groups.qbittorrent = {};
systemd.services."qbittorrent-nox" = {
after = [ "network.target" ];
wants = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStartPre = "${pkgs.bash}/bin/bash -c '${pkgs.coreutils}/bin/mkdir -p ${path} && ${pkgs.coreutils}/bin/chmod -R 755 ${path} && ${pkgs.coreutils}/bin/cp ${config.sops.templates."qbittorrent/configuration".path} ${path}/.config/qBittorrent/qBittorrent.conf'";
ExecStart = "${pkgs.unstable.qbittorrent-nox}/bin/qbittorrent-nox";
User = "qbittorrent";
Group = "media";
Restart = "on-failure";
ProtectKernelModules = true;
NoNewPrivileges = true;
};
};
services.nginx.virtualHosts."qbittorrent.${config.networking.hostName}.${config.networking.domain}" = {
forceSSL = true;
#useACMEHost = config.networking.domain; #not sure if this will work, unless
locations."/" = {
proxyWebsockets = true;
proxyPass = "http://localhost:${port}";
services.qbittorrent = {
enable = true;
extraArgs = [
"--confirm-legal-notice"
];
webuiPort = 8090;
torrentingPort = 44183;
serverConfig = {
LegalNotice.Accepted = true;
Meta.MigrationVersion=6;
Network.PortForwardingEnabled=true;
Preferences = {
WebUI = {
AuthSubnetWhitelist="192.168.1.0/24, 100.0.0.0/8";
AuthSubnetWhitelistEnabled=true;
UseUPnP=false;
};
BitTorrent = {
Session = {
AddExtensionToIncompleteFiles=true;
AlternativeGlobalDLSpeedLimit=1000;
AlternativeGlobalUPSpeedLimit=1000;
AnonymousModeEnabled=false;
BTProtocol="Both";
BandwidthSchedulerEnabled=false;
DefaultSavePath="/Main/Data/media/Downloads";
Encryption=1;
FinishedTorrentExportDirectory="/Main/Data/media/Downloads/torrents-complete";
GlobalDLSpeedLimit=0;
GlobalMaxRatio=1.5;
GlobalUPSpeedLimit=0;
I2P.Enabled=true;
IgnoreLimitsOnLAN=true;
IncludeOverheadInLimits=true;
Interface="tun0";
#InterfaceAddress="${config.sops.placeholder."qbittorrent/interfaceAddress"}";
InterfaceAddress="${interfaceaddress}";
InterfaceName="tun0";
LSDEnabled="true";
MaxActiveCheckingTorrents=15;
MaxRatioAction=1;
Port=44183;
Preallocation=true;
QueueingSystemEnabled=false;
SubcategoriesEnabled=true;
Tags="movie, anime";
TempPath="/Main/Data/media/Downloads/temp";
TempPathEnabled=true;
TorrentContentLayout="Subfolder";
TorrentExportDirectory="/Main/Data/media/Downloads/torrents";
UseAlternativeGlobalSpeedLimit=false;
};
};
basicAuthFile = config.sops.secrets."nginx/defaultpass".path;
RSS = {
AutoDownloader = {
DownloadRepacks=true;
EnableProcessing=true;
SmartEpisodeFilter="s(\\d+)e(\\d+), (\\d+)x(\\d+), \"(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})\", \"(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})\"";
};
Session.EnableProcessing=true;
};
General.Locale = "en";
};
};
};
}