summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Kassouni <alex@kassouni.net>2026-08-27 23:15:39 -0700
committerAlexander Kassouni <alex@kassouni.net>2026-08-27 23:15:39 -0700
commit332b06fd9baefdfa2b043b8e2c72b8c110940fc5 (patch)
tree13dc7941832f7d6e389dc43b79ae07e5c5f97529
parentecec5136f63d32862a42117c957f1f5bab65d13b (diff)
idk
-rw-r--r--TODO.md3
-rw-r--r--flake.lock149
-rw-r--r--flake.nix20
-rw-r--r--machines/hierophant/configuration.nix50
-rw-r--r--users/kassouni/ayu/ayu-dark.nix (renamed from users/kassouni/ayu.nix)0
-rw-r--r--users/kassouni/claude.nix9
-rw-r--r--users/kassouni/firefox.nix26
-rw-r--r--users/kassouni/ghostty.nix2
-rw-r--r--users/kassouni/home.nix11
-rw-r--r--users/kassouni/music.nix34
-rw-r--r--users/kassouni/neovim.nix4
-rw-r--r--users/kassouni/palette/default.nix11
-rw-r--r--users/kassouni/palette/reboot.nix12
-rw-r--r--users/kassouni/palette/rebuild.nix20
-rw-r--r--users/kassouni/palette/screenshot.nix12
-rw-r--r--users/kassouni/palette/shutdown.nix12
-rw-r--r--users/kassouni/rip.nix94
-rw-r--r--users/kassouni/scripts/default.nix8
-rw-r--r--users/kassouni/slippi.nix6
19 files changed, 430 insertions, 53 deletions
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..7f6066f
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,3 @@
+# TODO
+
+- [ ] tailscale is not declarative
diff --git a/flake.lock b/flake.lock
index 143758a..bf9fb94 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,5 +1,21 @@
{
"nodes": {
+ "flake-compat": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1696426674,
+ "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
+ "type": "github"
+ },
+ "original": {
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "type": "github"
+ }
+ },
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
@@ -26,11 +42,11 @@
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
- "lastModified": 1769996383,
- "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=",
+ "lastModified": 1785627969,
+ "narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
"owner": "hercules-ci",
"repo": "flake-parts",
- "rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
+ "rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
"type": "github"
},
"original": {
@@ -39,6 +55,51 @@
"type": "github"
}
},
+ "git-hooks": {
+ "inputs": {
+ "flake-compat": "flake-compat",
+ "gitignore": "gitignore",
+ "nixpkgs": [
+ "slippi",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1742649964,
+ "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=",
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "type": "github"
+ }
+ },
+ "gitignore": {
+ "inputs": {
+ "nixpkgs": [
+ "slippi",
+ "git-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1709087332,
+ "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
"home-manager": {
"inputs": {
"nixpkgs": [
@@ -46,11 +107,11 @@
]
},
"locked": {
- "lastModified": 1783740085,
- "narHash": "sha256-qajyHfZY29G2oEQk+uHxmsJcRoBUBXP9maTpFlwP/dI=",
+ "lastModified": 1785119570,
+ "narHash": "sha256-Rgs2xKnGLFWQscxUaXX07oyZeuMDOHEbqDOsgliLFGM=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "3cd22efe6471dc7365c822bd9ad73a21e55f38fb",
+ "rev": "d4fd24667c8cbef124bb70a20380cab75ec8474d",
"type": "github"
},
"original": {
@@ -62,11 +123,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1784011430,
- "narHash": "sha256-lDebytrYdd47IBLwvNOD+6AGeoqZ78CIKlp70hzW280=",
+ "lastModified": 1786089803,
+ "narHash": "sha256-ZuvZfVW2tB5tXYEcpcfhVXB3N4OhdZLOqOviy4OD4b4=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "8eeec934ae0dbeca3d7868c059568a65c08b2fc3",
+ "rev": "ee48b147c18c7de1e6ec97dc74792be42724bed1",
"type": "github"
},
"original": {
@@ -78,11 +139,11 @@
},
"nixpkgs-lib": {
"locked": {
- "lastModified": 1769909678,
- "narHash": "sha256-cBEymOf4/o3FD5AZnzC3J9hLbiZ+QDT/KDuyHXVJOpM=",
+ "lastModified": 1785031560,
+ "narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
- "rev": "72716169fe93074c333e8d0173151350670b824c",
+ "rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
"type": "github"
},
"original": {
@@ -91,6 +152,22 @@
"type": "github"
}
},
+ "nixpkgs-unstable": {
+ "locked": {
+ "lastModified": 1786106723,
+ "narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
"nixpkgs_2": {
"locked": {
"lastModified": 1781216227,
@@ -109,11 +186,11 @@
},
"nixpkgs_3": {
"locked": {
- "lastModified": 1784120854,
- "narHash": "sha256-KesHgItiZPgGX740axSiQLcIQ8D24MDqNpkKYWIek8k=",
+ "lastModified": 1785318670,
+ "narHash": "sha256-dN6Ou5x/+23FZLEpYP3IffO+NyJFzUlGumt1uu3MMaY=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "753cc8a3a87467296ddd1fa93f0cc3e81120ee46",
+ "rev": "0954f7ee2f6bb3dc7d4e3d0d8bcb8fd4bde4cfc5",
"type": "github"
},
"original": {
@@ -125,11 +202,11 @@
},
"nixpkgs_4": {
"locked": {
- "lastModified": 1771848320,
- "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=",
+ "lastModified": 1787360063,
+ "narHash": "sha256-dt4WdcvsA8/RCe+VZZwqU0X+XMM3wBbGCWA0/sFWzGo=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "2fc6539b481e1d2569f25f8799236694180c0993",
+ "rev": "2c423e03bbafcff28bfadc6781a4a8257f205cb5",
"type": "github"
},
"original": {
@@ -164,8 +241,10 @@
"inputs": {
"home-manager": "home-manager",
"nixpkgs": "nixpkgs",
+ "nixpkgs-unstable": "nixpkgs-unstable",
"nixvim": "nixvim",
"sidra": "sidra",
+ "slippi": "slippi",
"xmonad-config": "xmonad-config"
}
},
@@ -174,11 +253,11 @@
"nixpkgs": "nixpkgs_3"
},
"locked": {
- "lastModified": 1784302039,
- "narHash": "sha256-uRjqY4XymGneNy2Yyr58QWwjzn7QjgAWBHh4kLU6684=",
+ "lastModified": 1785827118,
+ "narHash": "sha256-tS2eSSpa1uLPUyIAJBpf00+A9KSHpC92gKMLavmHuio=",
"owner": "wimpysworld",
"repo": "sidra",
- "rev": "ead49318a80150a1e8e565ec236b6770b5c702d5",
+ "rev": "0597e5438fe98fef935cb528c2c9aa5db60171c9",
"type": "github"
},
"original": {
@@ -187,6 +266,30 @@
"type": "github"
}
},
+ "slippi": {
+ "inputs": {
+ "git-hooks": "git-hooks",
+ "home-manager": [
+ "home-manager"
+ ],
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1784166278,
+ "narHash": "sha256-TSvk8AK8ACGTSeC2v/tyWX3UiiaEQ5O4nX5jqVtEEEI=",
+ "owner": "lytedev",
+ "repo": "slippi-nix",
+ "rev": "d87fef3580e6afc19bc3fffbba61069df2452cbf",
+ "type": "github"
+ },
+ "original": {
+ "owner": "lytedev",
+ "repo": "slippi-nix",
+ "type": "github"
+ }
+ },
"systems": {
"locked": {
"lastModified": 1681028828,
@@ -208,8 +311,8 @@
"nixpkgs": "nixpkgs_4"
},
"locked": {
- "lastModified": 1784875697,
- "narHash": "sha256-ueJpwT4JUqMwYUWJ6eHBDblK5YfgclshvlQTu2T62ck=",
+ "lastModified": 1787544164,
+ "narHash": "sha256-ez8+EU0G06ITmoAr3ubNGbYpIKf4Gl+QiX31Eu6B6l4=",
"path": "/home/kassouni/Developer/xmonad-config",
"type": "path"
},
diff --git a/flake.nix b/flake.nix
index 404cfbe..847d3ab 100644
--- a/flake.nix
+++ b/flake.nix
@@ -3,21 +3,27 @@
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05";
+ nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager/release-26.05";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
nixvim.url = "github:nix-community/nixvim/nixos-26.05";
xmonad-config.url = "path:/home/kassouni/Developer/xmonad-config";
sidra.url = "github:wimpysworld/sidra";
+ slippi.url = "github:lytedev/slippi-nix";
+ slippi.inputs.nixpkgs.follows = "nixpkgs";
+ slippi.inputs.home-manager.follows = "home-manager";
};
outputs =
{
self,
nixpkgs,
+ nixpkgs-unstable,
home-manager,
nixvim,
xmonad-config,
sidra,
+ slippi,
...
}@inputs:
let
@@ -34,19 +40,33 @@
nixosConfigurations = {
hierophant = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
+ specialArgs = {
+ pkgs-unstable = import nixpkgs-unstable {
+ system = "x86_64-linux";
+ config.allowUnfree = true;
+ };
+ };
modules = [
./machines/hierophant/configuration.nix
./machines/hierophant/hardware-configuration.nix
xmonad-config.nixosModules.default
+ slippi.nixosModules.default
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
+ home-manager.extraSpecialArgs = {
+ pkgs-unstable = import nixpkgs-unstable {
+ system = "x86_64-linux";
+ config.allowUnfree = true;
+ };
+ };
home-manager.users.kassouni = { pkgs, ... }: {
imports = [
./users/kassouni/home.nix
nixvim.homeModules.nixvim
xmonad-config.homeManagerModules.default
+ slippi.homeManagerModules.default
];
home.packages = [ sidra.packages.${pkgs.system}.default ];
};
diff --git a/machines/hierophant/configuration.nix b/machines/hierophant/configuration.nix
index a37166e..a9a8d2c 100644
--- a/machines/hierophant/configuration.nix
+++ b/machines/hierophant/configuration.nix
@@ -6,6 +6,7 @@
config,
lib,
pkgs,
+ pkgs-unstable,
...
}:
@@ -19,17 +20,42 @@
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
+ boot.kernelModules = [ "sg" ];
+
+ virtualisation.docker = {
+ enable = true;
+ };
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
- services.tailscale.enable = true;
- services.tailscale.extraSetFlags = [ "--ssh" ];
+ services.avahi = {
+ enable = true;
+ nssmdns4 = true;
+ openFirewall = true;
+ };
+
+ services.printing = {
+ enable = true;
+ drivers = with pkgs; [
+ cups-filters
+ cups-browsed
+ ];
+ };
+
+ services.ipp-usb.enable = true;
services.gnome.gnome-keyring.enable = true;
+ services.tailscale = {
+ package = pkgs-unstable.tailscale;
+ enable = true;
+ extraSetFlags = [ "--ssh" ];
+ extraDaemonFlags = [ "--no-logs-no-support" ];
+ };
+
nixpkgs.config.allowUnfree = true;
hardware.graphics.enable = true;
@@ -39,9 +65,11 @@
programs.steam.enable = true;
- services.displayManager.sddm.enable = true;
+ services.displayManager.ly.enable = true;
+ services.displayManager.ly.x11Support = true;
+
services.xserver.displayManager.sessionCommands = ''
- xrandr --output DP-4 --mode 3840x2160 --rate 159.98
+ xrandr --output DP-0 --mode 3840x2160 --rate 159.98
'';
networking.hostName = "hierophant"; # Define your hostname.
@@ -74,10 +102,22 @@
# Enable sound.
# services.pulseaudio.enable = true;
# OR
+
+ security.rtkit.enable = true;
+
services.pipewire = {
enable = true;
pulse.enable = true;
alsa.enable = true;
+ extraConfig.pipewire."10-clock-rates" = {
+ "context.properties" = {
+ "default.clock.rate" = 48000;
+ "default.clock.allowed-rates" = [
+ 44100
+ 48000
+ ];
+ };
+ };
};
# Enable touchpad support (enabled default in most desktopManager).
@@ -90,6 +130,7 @@
extraGroups = [
"wheel"
"video"
+ "docker"
"input"
"audio"
]; # Enable 'sudo' for the user.
@@ -99,7 +140,6 @@
dejavu_fonts
];
- programs.firefox.enable = true;
# List packages installed in system profile.
# You can use https://search.nixos.org/ to find more packages (and options).
diff --git a/users/kassouni/ayu.nix b/users/kassouni/ayu/ayu-dark.nix
index 37ff83f..37ff83f 100644
--- a/users/kassouni/ayu.nix
+++ b/users/kassouni/ayu/ayu-dark.nix
diff --git a/users/kassouni/claude.nix b/users/kassouni/claude.nix
new file mode 100644
index 0000000..d5a9380
--- /dev/null
+++ b/users/kassouni/claude.nix
@@ -0,0 +1,9 @@
+{ ... }: {
+ programs.claude-code = {
+ enable = true;
+ settings = {
+ autoMemoryEnabled = false;
+ model = "opus";
+ };
+ };
+}
diff --git a/users/kassouni/firefox.nix b/users/kassouni/firefox.nix
index 42dd583..e1cee19 100644
--- a/users/kassouni/firefox.nix
+++ b/users/kassouni/firefox.nix
@@ -2,6 +2,32 @@
{
programs.firefox = {
enable = true;
+
+ policies = {
+ ExtensionSettings = {
+ "uBlock0@raymondhill.net" = {
+ default_area = "navbar";
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
+ installation_mode = "normal_installed";
+ private_browsing = true;
+ };
+
+ "{d634138d-c276-4fc8-924b-40a0ea21d284}" = {
+ default_area = "navbar";
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/1password-x-password-manager/latest.xpi";
+ installation_mode = "normal_installed";
+ private_browsing = true;
+ };
+
+ "{9063c2e9-e07c-4c2c-9646-cfe7ca8d0498}" = {
+ default_area = "menupanel";
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/old-reddit-redirect/latest.xpi";
+ installation_mode = "normal_installed";
+ private_browsing = true;
+ };
+ };
+ };
+
profiles.kassouni = {
isDefault = true;
bookmarks = {
diff --git a/users/kassouni/ghostty.nix b/users/kassouni/ghostty.nix
index d70a194..8c4aefd 100644
--- a/users/kassouni/ghostty.nix
+++ b/users/kassouni/ghostty.nix
@@ -3,7 +3,7 @@
programs.ghostty = {
enable = true;
settings = {
- theme = "Ayu";
+ theme = "Ayu Light";
font-family = config.theme.font.family;
font-size = 24;
window-decoration = "none";
diff --git a/users/kassouni/home.nix b/users/kassouni/home.nix
index cfbd86b..dc4675e 100644
--- a/users/kassouni/home.nix
+++ b/users/kassouni/home.nix
@@ -7,10 +7,14 @@
{
imports = [
./neovim.nix
+ ./claude.nix
./fuzzel.nix
./rofi.nix
+ ./music.nix
+ ./slippi.nix
./ssh.nix
- ./ayu.nix
+ ./rip.nix
+ ./ayu/ayu-dark.nix
./git.nix
./ghostty.nix
./theme.nix
@@ -36,8 +40,7 @@
};
home.packages = with pkgs; [
- vlc
- strawberry
+ dolphin-emu
cmus
btop
wget
@@ -48,11 +51,9 @@
bat
lsd
yazi
- claude-code
tldr
curl
_1password-gui
- opencode
spotify
prismlauncher
];
diff --git a/users/kassouni/music.nix b/users/kassouni/music.nix
new file mode 100644
index 0000000..65a9edb
--- /dev/null
+++ b/users/kassouni/music.nix
@@ -0,0 +1,34 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ cdparanoia-iii
+ ffmpeg
+ libgpod
+ imagemagick
+ ];
+
+ programs.beets = {
+ enable = true;
+ settings = {
+ plugins = [
+ "convert"
+ "musicbrainz"
+ "chroma"
+ "fetchart"
+ "embedart"
+ ];
+
+ convert = {
+ format = "flac";
+ auto = true;
+ never_convert_lossy_files = true;
+ };
+
+ embedart = {
+ maxwidth = 500;
+ };
+
+ directory = "~/Music/beets/library";
+ library = "~/Music/beets/musiclibrary.db";
+ };
+ };
+}
diff --git a/users/kassouni/neovim.nix b/users/kassouni/neovim.nix
index ccdc9ca..ec90023 100644
--- a/users/kassouni/neovim.nix
+++ b/users/kassouni/neovim.nix
@@ -37,6 +37,10 @@
package = null;
};
nixd.enable = true;
+ rust_analyzer = {
+ enable = true;
+ package = null;
+ };
};
};
diff --git a/users/kassouni/palette/default.nix b/users/kassouni/palette/default.nix
index 08c68b1..235f774 100644
--- a/users/kassouni/palette/default.nix
+++ b/users/kassouni/palette/default.nix
@@ -5,17 +5,16 @@ let
(builtins.readDir ./.)
);
commands = map (file: pkgs.callPackage (./. + "/${file}") { }) commandFiles;
- palette = pkgs.symlinkJoin {
- name = "palette";
- paths = commands;
- };
in
{
home.packages = [
(pkgs.writers.writeBashBin "open-palette" ''
set -eu
- choice=$(${pkgs.coreutils}/bin/ls ${palette}/bin | ${pkgs.rofi}/bin/rofi -dmenu -i -p palette)
- exec "${palette}/bin/$choice"
+ exes=(${lib.concatMapStringsSep " " (c: c.exe) commands})
+ idx=$(${pkgs.rofi}/bin/rofi -dmenu -i -format i -p palette <<EOF
+${lib.concatMapStrings (c: "${c.icon} ${c.name}\n") commands}EOF
+ )
+ exec "''${exes[$idx]}"
'')
];
}
diff --git a/users/kassouni/palette/reboot.nix b/users/kassouni/palette/reboot.nix
index 0b5d51f..bc25ef4 100644
--- a/users/kassouni/palette/reboot.nix
+++ b/users/kassouni/palette/reboot.nix
@@ -1,5 +1,9 @@
{ writers, systemd }:
-writers.writeBashBin "reboot" ''
- set -eu
- ${systemd}/bin/systemctl reboot
-''
+{
+ name = "reboot";
+ icon = "󰑐";
+ exe = writers.writeBash "reboot" ''
+ set -eu
+ exec ${systemd}/bin/systemctl reboot
+ '';
+}
diff --git a/users/kassouni/palette/rebuild.nix b/users/kassouni/palette/rebuild.nix
new file mode 100644
index 0000000..e42a7c5
--- /dev/null
+++ b/users/kassouni/palette/rebuild.nix
@@ -0,0 +1,20 @@
+{ writers, ghostty }:
+{
+ name = "rebuild";
+ icon = "󱄅";
+ # Rebuilds need a terminal: sudo prompts for a password and nixos-rebuild
+ # streams a lot of output. Spawn ghostty with a login shell so it inherits
+ # the system sudo (setuid) and the user's nix from PATH. Mirrors `make rebuild`.
+ exe = writers.writeBash "rebuild" ''
+ set -eu
+ exec ${ghostty}/bin/ghostty -e bash -lc '
+ set -eu
+ cd /home/kassouni/Developer/nixos-config
+ nix flake update xmonad-config
+ sudo nixos-rebuild switch --flake .
+ echo
+ echo "Rebuild finished. Press enter to close."
+ read -r _
+ '
+ '';
+}
diff --git a/users/kassouni/palette/screenshot.nix b/users/kassouni/palette/screenshot.nix
index 2190024..6f2beea 100644
--- a/users/kassouni/palette/screenshot.nix
+++ b/users/kassouni/palette/screenshot.nix
@@ -1,5 +1,9 @@
{ writers, maim, xclip }:
-writers.writeBashBin "screenshot" ''
- set -eu
- ${maim}/bin/maim -s | ${xclip}/bin/xclip -selection clipboard -t image/png
-''
+{
+ name = "screenshot";
+ icon = "󰹑";
+ exe = writers.writeBash "screenshot" ''
+ set -eu
+ ${maim}/bin/maim -s | ${xclip}/bin/xclip -selection clipboard -t image/png
+ '';
+}
diff --git a/users/kassouni/palette/shutdown.nix b/users/kassouni/palette/shutdown.nix
index 919cf0a..2db9425 100644
--- a/users/kassouni/palette/shutdown.nix
+++ b/users/kassouni/palette/shutdown.nix
@@ -1,5 +1,9 @@
{ writers, systemd }:
-writers.writeBashBin "shutdown" ''
- set -eu
- ${systemd}/bin/systemctl poweroff
-''
+{
+ name = "shutdown";
+ icon = "󰐥";
+ exe = writers.writeBash "shutdown" ''
+ set -eu
+ exec ${systemd}/bin/systemctl poweroff
+ '';
+}
diff --git a/users/kassouni/rip.nix b/users/kassouni/rip.nix
new file mode 100644
index 0000000..4fd8f76
--- /dev/null
+++ b/users/kassouni/rip.nix
@@ -0,0 +1,94 @@
+{ pkgs, pkgs-unstable, ... }:
+let
+ # Java 8 is the runtime that drives libbluray's BD-J menus; 17/21 hit
+ # reflection/AWT failures in disc Xlets.
+ bdjJdk = pkgs.jdk8;
+ # libbluray reads JAVA_HOME and locates the JVM at
+ # <home>/jre/lib/<arch>/server/libjvm.so. On nixpkgs that dir is the `.home`
+ # attribute (…/lib/openjdk), not the package store root.
+ bdjJavaHome = bdjJdk.home;
+
+ # libbluray's BD-J classes are Java 1.4 bytecode, so the stock jars load on any
+ # JVM — no recompile needed. LIBBLURAY_CP must be a SINGLE jar path (the j2se
+ # jar); libbluray auto-loads the matching AWT jar from the same directory.
+ # A ':'-joined classpath is treated as one filename and fails to open.
+ libbluray = pkgs.libbluray-full;
+ bdjJar = "${libbluray}/share/java/libbluray-j2se-${libbluray.version}.jar";
+
+ # Wrap every vlc entrypoint so BD-J playback uses jdk8. libbluray keys off
+ # JAVA_HOME; BDJ_JAVA_HOME is set too for good measure.
+ vlc-bluray = pkgs.symlinkJoin {
+ name = "vlc-bluray";
+ paths = [ pkgs.vlc ];
+ nativeBuildInputs = [ pkgs.makeWrapper ];
+ postBuild = ''
+ for prog in vlc cvlc nvlc qvlc rvlc svlc; do
+ if [ -e "$out/bin/$prog" ]; then
+ rm "$out/bin/$prog"
+ makeWrapper ${pkgs.vlc}/bin/$prog "$out/bin/$prog" \
+ --set JAVA_HOME "${bdjJavaHome}" \
+ --set BDJ_JAVA_HOME "${bdjJavaHome}" \
+ --set LIBBLURAY_CP "${bdjJar}" \
+ --prefix PATH : "${bdjJavaHome}/bin"
+ fi
+ done
+ '';
+ };
+
+ # rip.sh, verbatim — wrapped so bd_info/makemkvcon/mkisofs resolve from the
+ # Nix store instead of the ambient PATH. writeShellApplication supplies the
+ # shebang + `set -euo pipefail` and shellchecks the body at build time.
+ rip = pkgs.writeShellApplication {
+ name = "rip";
+ runtimeInputs = [
+ libbluray # bd_info
+ pkgs-unstable.makemkv # makemkvcon
+ pkgs.cdrkit # mkisofs
+ pkgs.gawk # awk
+ pkgs.coreutils # tr, mkdir
+ ];
+ text = ''
+ # Remove the decrypted backup folder once the ISO exists and is non-empty.
+ # The ISO wraps the same VIDEO_TS/BDMV payload, so the folder is redundant.
+ cleanup_backup() {
+ local backup="$1" iso="$2"
+ if [[ -s "$iso" ]]; then
+ rm -rf "$backup"
+ else
+ echo "ISO $iso missing or empty; keeping backup folder $backup" >&2
+ exit 1
+ fi
+ }
+
+ RIPS_DIR="/home/kassouni/Videos/backups"
+
+ VOLUME_NAME=$(bd_info /dev/sr0 | awk -F': ' '/Volume Identifier/ {print $2}' | tr -d '\r')
+
+ if [[ -z "$VOLUME_NAME" ]]; then
+ echo "Could not read volume identifier from /dev/sr0 (no disc?)" >&2
+ exit 1
+ fi
+
+ BACKUP_PATH="$RIPS_DIR/$VOLUME_NAME"
+ mkdir -p "$BACKUP_PATH"
+
+ makemkvcon backup --decrypt --messages=-stdout --progress=-same disc:/dev/sr0 "$BACKUP_PATH"
+
+ mkisofs -udf -iso-level "3" -allow-limited-size -input-charset "utf-8" -o "$BACKUP_PATH.iso" "$BACKUP_PATH/"
+
+ cleanup_backup "$BACKUP_PATH" "$BACKUP_PATH.iso"
+ '';
+ };
+in
+{
+ home.packages = with pkgs; [
+ rip
+ cdrkit
+ libbluray
+ libaacs
+ pkgs-unstable.makemkv
+ udftools
+ vlc-bluray
+ bdjJdk
+ ];
+}
diff --git a/users/kassouni/scripts/default.nix b/users/kassouni/scripts/default.nix
index 5a74f30..2b86b7e 100644
--- a/users/kassouni/scripts/default.nix
+++ b/users/kassouni/scripts/default.nix
@@ -7,7 +7,7 @@
date "+%l:%M%p on %A, %B %e, %Y"
echo
- ${pkgs.util-linux}/bin/cal | ${pkgs.gnugrep}/bin/grep -E "\b$(date '+%e')\b| "
+ ${pkgs.util-linux}/bin/cal
'')
(pkgs.writers.writeBashBin "r" ''
set -e
@@ -16,5 +16,11 @@
cd "$(git rev-parse --show-toplevel)"
exec "$@"
'')
+ (pkgs.writers.writeBashBin "serve" ''
+ set -e
+ set -u
+
+ ${pkgs.python3}/bin/python -m http.server 8080
+ '')
];
}
diff --git a/users/kassouni/slippi.nix b/users/kassouni/slippi.nix
new file mode 100644
index 0000000..e315220
--- /dev/null
+++ b/users/kassouni/slippi.nix
@@ -0,0 +1,6 @@
+{ config, ... }:
+{
+ slippi-launcher = {
+ isoPath = "${config.home.homeDirectory}/Sync/Games/GC/Super Smash Bros. Melee (v1.02).iso";
+ };
+}