1

Compare commits

...

11 Commits

21 changed files with 563 additions and 66 deletions

View File

@ -115,6 +115,10 @@ rec {
# Java:
# gradle
# Python:
# hatch
# py-spy
# Qt:
# qt6.wrapQtAppsHook # For the shellHook
];
@ -203,6 +207,9 @@ rec {
# QT imports to use with "qmlls -E"
# QML_IMPORT_PATH = "${pkgs.qt6.full}/lib/qt-6/qml";
# Set PYTHONPATH
# PYTHONPATH = ".";
# =========================================================================================
# Define shell environment
# =========================================================================================
@ -264,6 +271,11 @@ rec {
# Clojure:
# abbr -a clojure-deps "deps-lock --lein"
# Python:
# abbr -a run "python ./app/main.py"
# abbr -a profile "py-spy record -o profile.svg -- python ./app/main.py && firefox profile.svg"
# abbr -a ptop "py-spy top -- python ./app/main.py"
'';
in
builtins.concatStringsSep "\n" [

84
flake.lock generated
View File

@ -9,11 +9,11 @@
]
},
"locked": {
"lastModified": 1751041811,
"narHash": "sha256-NGty9sYgiB5gSa1r0nN4vfaRZcARCQ5TgbpSAPq+umk=",
"lastModified": 1751619699,
"narHash": "sha256-3Si+Gi0e8PDIzUrV6LYCUN21EvaQyPaOU64kF6KT824=",
"owner": "Aylur",
"repo": "ags",
"rev": "5ee4f3c40f47e12334187ba9305f7c80ee1543fa",
"rev": "e5e2efaf2e05e077190cfddabf5b827edae5ef8b",
"type": "github"
},
"original": {
@ -104,11 +104,11 @@
]
},
"locked": {
"lastModified": 1751040887,
"narHash": "sha256-fN0wK9vObApD6M0nBJFk687MLuobzO805hBkHM3eRAM=",
"lastModified": 1751126708,
"narHash": "sha256-AodIKw7TmI7rHVcOfEsO82stupMYIMVQeLAUQfVxnkU=",
"owner": "aylur",
"repo": "astal",
"rev": "71e88fcb57ea80b42efb7bff75a914e0b682059e",
"rev": "ac90f09385a2295da9fdc108aaba4a317aaeacc7",
"type": "github"
},
"original": {
@ -143,11 +143,11 @@
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1751041558,
"narHash": "sha256-uSfdzrgBAZweKqRfMcioRK1QxDz2mjc73MxVI+fbAGA=",
"lastModified": 1751735311,
"narHash": "sha256-PvW5QG99yo1caA3YEMHuDHTDaa+kPo4VLqo3h48Ja6A=",
"owner": "nix-community",
"repo": "emacs-overlay",
"rev": "50a1de22af011ea05433453f29c445050c4a747c",
"rev": "ab81896fac2f4238718d42248af2cba678050963",
"type": "github"
},
"original": {
@ -341,11 +341,11 @@
"gnim": {
"flake": false,
"locked": {
"lastModified": 1750803500,
"narHash": "sha256-6eM7gaRneUW+Zzg6xZtz6dllaFtUNDVnYH+dPx6XYP4=",
"lastModified": 1751120710,
"narHash": "sha256-sT1ILM8m1QG8CeMmqLHhW/8T/MzUq3JL9jO3V7FMa4w=",
"owner": "aylur",
"repo": "gnim",
"rev": "ab86c755d5c610999ab0ddcb0f4d60b1ccf5c9c6",
"rev": "5d2b734be452e2819f3a7313dbb34fa43c23e5d9",
"type": "github"
},
"original": {
@ -356,11 +356,11 @@
},
"hardware": {
"locked": {
"lastModified": 1750837715,
"narHash": "sha256-2m1ceZjbmgrJCZ2PuQZaK4in3gcg3o6rZ7WK6dr5vAA=",
"lastModified": 1751432711,
"narHash": "sha256-136MeWtckSHTN9Z2WRNRdZ8oRP3vyx3L8UxeBYE+J9w=",
"owner": "nixos",
"repo": "nixos-hardware",
"rev": "98236410ea0fe204d0447149537a924fb71a6d4f",
"rev": "497ae1357f1ac97f1aea31a4cb74ad0d534ef41f",
"type": "github"
},
"original": {
@ -376,11 +376,11 @@
]
},
"locked": {
"lastModified": 1750973805,
"narHash": "sha256-BZXgag7I0rnL/HMHAsBz3tQrfKAibpY2vovexl2lS+Y=",
"lastModified": 1751729568,
"narHash": "sha256-ay7O1jjalUxkL23QWLv9C2s8rdVGs3hUOPZClIbUHKs=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "080e8b48b0318b38143d5865de9334f46d51fce3",
"rev": "f117b383dd591fd579bce5ee7bac07a3fdc1d050",
"type": "github"
},
"original": {
@ -1121,11 +1121,11 @@
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1750646418,
"narHash": "sha256-4UAN+W0Lp4xnUiHYXUXAPX18t+bn6c4Btry2RqM9JHY=",
"lastModified": 1751274312,
"narHash": "sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT+g=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1f426f65ac4e6bf808923eb6f8b8c2bfba3d18c5",
"rev": "50ab793786d9de88ee30ec4e4c24fb4236fc2674",
"type": "github"
},
"original": {
@ -1169,11 +1169,11 @@
},
"nixpkgs_4": {
"locked": {
"lastModified": 1750776420,
"narHash": "sha256-/CG+w0o0oJ5itVklOoLbdn2dGB0wbZVOoDm4np6w09A=",
"lastModified": 1751637120,
"narHash": "sha256-xVNy/XopSfIG9c46nRmPaKfH1Gn/56vQ8++xWA8itO4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "30a61f056ac492e3b7cdcb69c1e6abdcf00e39cf",
"rev": "5c724ed1388e53cc231ed98330a60eb2f7be4be3",
"type": "github"
},
"original": {
@ -1206,11 +1206,11 @@
"systems": "systems_4"
},
"locked": {
"lastModified": 1751053139,
"narHash": "sha256-FMcWdec8fAXs7kiOQBsD+vA/RzjqoDz3zoYgPDQpZlA=",
"lastModified": 1751492444,
"narHash": "sha256-26NgRXwhNM2x4hrok0C3CqSf2v0vi9byONNON5PzbHQ=",
"owner": "nix-community",
"repo": "nixvim",
"rev": "c39f5f39c32e0a8fe91bff1cda847de7a0269411",
"rev": "239d331bb48673dfd00d7187654892471cd60d44",
"type": "github"
},
"original": {
@ -1247,15 +1247,14 @@
"flake-parts": "flake-parts_2",
"nixpkgs": [
"nixpkgs"
],
"treefmt-nix": "treefmt-nix"
]
},
"locked": {
"lastModified": 1751060810,
"narHash": "sha256-8lU/u/LhfCr8/0SmQBsAMwtj3IrMgybSQzY3FzEYpwc=",
"lastModified": 1751736169,
"narHash": "sha256-JTsW3PPda6YWT7dlNZP7wiNhRmZ9qG09aBzvpInDyQE=",
"owner": "nix-community",
"repo": "NUR",
"rev": "539d77173dba7799eafe4b77f993e1ad7419c28e",
"rev": "179e95cda1a895ed05b22e8eba14fc61ce28ac2f",
"type": "github"
},
"original": {
@ -1413,27 +1412,6 @@
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1733222881,
"narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "49717b5af6f80172275d47a418c9719a31a78b53",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"v4l2loopback-pinned": {
"locked": {
"lastModified": 1748124733,

View File

@ -39,8 +39,6 @@ rec {
};
modules = {
ags.enable = false; # TODO: Configure
chromium = {
enable = true;
google = false;
@ -53,6 +51,8 @@ rec {
font = "JetBrainsMono Nerd Font Mono";
};
docs.enable = true;
firefox = {
enable = true;
wayland = true;
@ -108,6 +108,7 @@ rec {
"nextcloud --background"
"keepassxc"
"ferdium"
"kdeconnect-indicator"
];
};
@ -205,7 +206,6 @@ rec {
hyprpanel.enable = true;
kitty.enable = true;
latex.enable = true;
neovim = {
enable = true;
@ -215,6 +215,8 @@ rec {
nnn.enable = false;
rmpc.enable = true;
rofi = {
enable = true;
# theme = "Three-Bears";
@ -281,6 +283,7 @@ rec {
# Files to generate in the home directory are specified here.
file = let
# NOTE: SSH public key
sshPublicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJAoJac+GdGtzblCMA0lBfMdSR6aQ4YyovrNglCFGIny christoph.urlacher@protonmail.com";
in {
# Generate a list of installed user packages in ~/.local/share/current-user-packages
@ -355,10 +358,12 @@ rec {
lm_sensors # Readout hardware sensors
acpica-tools # Dump ACPI tables etc.
# Video/Image utils
# Video/Image/Audio utils
ffmpeg_7-full # I love ffmpeg (including ffplay)
ffmpeg-normalize # Normalize audio
imagemagick # Convert image (magic)
mp3val # Validate mp3 files
flac # Validate flac files
# Document utils
poppler_utils # pdfunite
@ -458,6 +463,64 @@ rec {
};
};
# Music taggins and mpd stats collection
beets = {
enable = true;
mpdIntegration = {
host = "127.0.0.1";
port = config.services.mpd.network.port;
enableUpdate = true;
enableStats = true;
};
# https://beets.readthedocs.io/en/stable/reference/config.html
settings = {
directory = "${home.homeDirectory}/Music";
threaded = "yes";
art_filename = "cover";
ui = {
color = "yes";
};
import = {
write = "yes"; # Write metadata to files
copy = "yes"; # Move files to the music directory when importing
log = "${home.homeDirectory}/Music/.beetslog.txt";
};
paths = {
default = "$albumartist/$albumartist - $album/$track $title";
singleton = "$arist/0 Singles/$artist - $title"; # Single songs
comp = "1 Various Arists/$album/$track $title";
};
plugins = [
"badfiles" # check audio file integrity
"duplicates"
"fetchart" # pickup local cover art or search online
"fish" # beet fish generates ~/.config/fish/completions file
"lyrics" # fetch song lyrics
"replaygain" # write replaygain tags for automatic loudness adjustments
];
fetchart = {
auto = "yes";
sources = "filesystem coverart itunes amazon albumart"; # sources are queried in this order
};
lyrics = {
synced = "yes"; # prefer synced lyrics if provided
};
replaygain = {
auto = "yes"; # analyze on import automatically
backend = "ffmpeg";
overwrite = true; # re-analyze files with existing replaygain tags on import
};
};
};
btop.enable = true;
direnv = {
@ -621,6 +684,7 @@ rec {
};
nushell.enable = false;
ssh = {
enable = true; # NOTE: Do NOT generate .ssh/config using HM, as it will have invalid permissions!
compression = true;
@ -873,7 +937,63 @@ rec {
};
services = {
# kdeconnect.enable = true; # Note: This does not setup the firewall at all
kdeconnect.enable = nixosConfig.programs.kdeconnect.enable; # Only the system package sets up the firewall
mpd = {
enable = true;
dataDir = "${home.homeDirectory}/Music/.mpd";
musicDirectory = "${home.homeDirectory}/Music";
network = {
listenAddress = "127.0.0.1"; # Listen on all addresses: "any"
port = 6600;
};
extraArgs = ["--verbose"];
extraConfig = ''
# Refresh the database whenever files in the musicDirectory change
auto_update "yes"
# Don't start playback after startup
restore_paused "yes"
# Use track tags on shuffle and album tags on album play
replaygain "auto"
# PipeWire main output
audio_output {
type "pipewire"
name "PipeWire Sound Server"
mixer_type "hardware"
# Use hardware mixer instead of software volume filter (replaygain_handler "software")
replay_gain_handler "mixer"
}
# FiFo output for cava visualization
audio_output {
type "fifo"
name "my_fifo"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
# Pre-cache 1GB of the queue
# input_cache {
# size "1 GB"
# }
# follow_outside_symlinks "no" # If mpd should follow symlinks pointing outside the musicDirectory
# follow_inside_symlinks "yes" # If mpd should follow symlinks pointing inside the musicDirectory
'';
};
# MPD integration with mpris (used by player-ctl).
# We want to use mpris as it also supports other players (e.g. Spotify) or browsers.
mpd-mpris = {
enable = true;
mpd.useLocal = true;
};
flatpak = {
# FlatHub stable is only added by default if no custom remotes are specified

View File

@ -0,0 +1,14 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"experimentalDecorators": true,
"strict": true,
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "Bundler",
// "checkJs": true,
// "allowJs": true,
"jsx": "react-jsx",
"jsxImportSource": "astal/gtk4",
}
}

View File

@ -3,18 +3,18 @@
# Obsolete modules are kept in "1_deprecated" for reference.
# My own HM modules
./ags
./chromium
./color
./docs
./firefox
./fish
./hyprland
./hyprpanel
./kitty
./latex
./neovim
./nnn
./paths
./rmpc
./rofi
./waybar
./zathura

View File

@ -5,11 +5,11 @@
pkgs,
...
}: let
inherit (config.modules) latex;
inherit (config.modules) docs;
in {
options.modules.latex = import ./options.nix {inherit lib mylib;};
options.modules.docs = import ./options.nix {inherit lib mylib;};
config = lib.mkIf latex.enable {
config = lib.mkIf docs.enable {
home = {
packages = with pkgs; [
texliveFull

View File

@ -0,0 +1,9 @@
{
lib,
mylib,
...
}:
with lib;
with mylib.modules; {
enable = mkEnableOption "Enable Document Support (e.g. LaTeX)";
}

View File

@ -125,7 +125,7 @@ in {
don-t-fuck-with-paste
enhancer-for-youtube
fastforwardteam # skip URL shorteners
faststream # replace video players with a faster one
# faststream # replace video players with a faster one
frankerfacez # twitch emotes
indie-wiki-buddy
keepassxc-browser

View File

@ -475,6 +475,9 @@ in {
disable_hyprland_logo = true;
force_default_wallpaper = 0;
# Say no to the "Application not responding" window
enable_anr_dialog = false;
disable_splash_rendering = true;
font_family = "${color.font}";
};

View File

@ -0,0 +1,361 @@
{
config,
nixosConfig,
lib,
mylib,
pkgs,
...
}: let
inherit (config.modules) rmpc;
in {
options.modules.rmpc = import ./options.nix {inherit lib mylib;};
config = lib.mkIf rmpc.enable {
assertions = [
{
assertion = config.services.mpd.enable;
message = "Enabling rmpc requires mpd!";
}
];
programs.rmpc.enable = true;
home.file = {
".config/rmpc/config.ron".text = ''
#![enable(implicit_some)]
#![enable(unwrap_newtypes)]
#![enable(unwrap_variant_newtypes)]
(
address: "127.0.0.1:${builtins.toString config.services.mpd.network.port}",
password: None,
theme: "chriphost",
cache_dir: None,
on_song_change: None,
volume_step: 5,
max_fps: 30,
scrolloff: 0,
wrap_navigation: false,
enable_mouse: true,
enable_config_hot_reload: true,
status_update_interval_ms: 1000,
rewind_to_start_sec: 30,
// Keep this on false, otherwise queue changes will be applied to the current playlist
reflect_changes_to_playlist: false,
select_current_song_on_change: false,
browser_song_sort: [Disc, Track, Artist, Title],
directories_sort: SortFormat(group_by_type: true, reverse: false),
album_art: (
method: Auto,
max_size_px: (width: 1200, height: 1200),
disabled_protocols: ["http://", "https://"],
vertical_align: Center,
horizontal_align: Center,
),
keybinds: (
global: {
":": CommandMode,
",": VolumeDown,
"s": Stop,
".": VolumeUp,
"<Tab>": NextTab,
"<S-Tab>": PreviousTab,
"1": SwitchToTab("Queue"),
"2": SwitchToTab("Directories"),
"3": SwitchToTab("Artists"),
"4": SwitchToTab("Album Artists"),
"5": SwitchToTab("Albums"),
"6": SwitchToTab("Playlists"),
"7": SwitchToTab("Search"),
"q": Quit,
">": NextTrack,
"p": TogglePause,
"<": PreviousTrack,
"f": SeekForward,
"z": ToggleRepeat,
"x": ToggleRandom,
"c": ToggleConsume,
"v": ToggleSingle,
"b": SeekBack,
"~": ShowHelp,
"u": Update,
"U": Rescan,
"I": ShowCurrentSongInfo,
"O": ShowOutputs,
"P": ShowDecoders,
"R": AddRandom,
},
navigation: {
"k": Up,
"j": Down,
"h": Left,
"l": Right,
"<Up>": Up,
"<Down>": Down,
"<Left>": Left,
"<Right>": Right,
"<C-k>": PaneUp,
"<C-j>": PaneDown,
"<C-h>": PaneLeft,
"<C-l>": PaneRight,
"<C-u>": UpHalf,
"N": PreviousResult,
"a": Add,
"A": AddAll,
"r": Rename,
"n": NextResult,
"g": Top,
"<Space>": Select,
"<C-Space>": InvertSelection,
"G": Bottom,
"<CR>": Confirm,
"i": FocusInput,
"J": MoveDown,
"<C-d>": DownHalf,
"/": EnterSearch,
"<C-c>": Close,
"<Esc>": Close,
"K": MoveUp,
"D": Delete,
"B": ShowInfo,
},
queue: {
"D": DeleteAll,
"<CR>": Play,
"<C-s>": Save,
"a": AddToPlaylist,
"d": Delete,
"C": JumpToCurrent,
"X": Shuffle,
},
),
search: (
case_sensitive: false,
mode: Contains,
tags: [
(value: "any", label: "Any Tag"),
(value: "artist", label: "Artist"),
(value: "album", label: "Album"),
(value: "albumartist", label: "Album Artist"),
(value: "title", label: "Title"),
(value: "filename", label: "Filename"),
(value: "genre", label: "Genre"),
],
),
artists: (
album_display_mode: SplitByDate,
album_sort_by: Date,
),
tabs: [
(
name: "Queue",
pane: Split(
direction: Horizontal,
panes: [(size: "40%", pane: Pane(AlbumArt)), (size: "60%", pane: Pane(Queue))],
),
),
(
name: "Directories",
pane: Pane(Directories),
),
(
name: "Artists",
pane: Pane(Artists),
),
(
name: "Album Artists",
pane: Pane(AlbumArtists),
),
(
name: "Albums",
pane: Pane(Albums),
),
(
name: "Playlists",
pane: Pane(Playlists),
),
(
name: "Search",
pane: Pane(Search),
),
],
)
'';
".config/rmpc/themes/chriphost.ron".text = ''
#![enable(implicit_some)]
#![enable(unwrap_newtypes)]
#![enable(unwrap_variant_newtypes)]
(
default_album_art_path: None,
show_song_table_header: true,
draw_borders: true,
format_tag_separator: " | ",
browser_column_widths: [20, 38, 42],
background_color: None,
text_color: None,
header_background_color: None,
modal_background_color: None,
modal_backdrop: false,
preview_label_style: (fg: "yellow"),
preview_metadata_group_style: (fg: "yellow", modifiers: "Bold"),
tab_bar: (
enabled: true,
active_style: (fg: "black", bg: "blue", modifiers: "Bold"),
inactive_style: (),
),
highlighted_item_style: (fg: "blue", modifiers: "Bold"),
current_item_style: (fg: "black", bg: "blue", modifiers: "Bold"),
borders_style: (fg: "blue"),
highlight_border_style: (fg: "blue"),
symbols: (
song: "S",
dir: "D",
playlist: "P",
marker: "M",
ellipsis: "...",
song_style: None,
dir_style: None,
playlist_style: None,
),
level_styles: (
info: (fg: "blue", bg: "black"),
warn: (fg: "yellow", bg: "black"),
error: (fg: "red", bg: "black"),
debug: (fg: "light_green", bg: "black"),
trace: (fg: "magenta", bg: "black"),
),
progress_bar: (
symbols: ["[", "-", ">", " ", "]"],
track_style: (fg: "#1e2030"),
elapsed_style: (fg: "blue"),
thumb_style: (fg: "blue", bg: "#1e2030"),
),
scrollbar: (
symbols: ["", "", "", ""],
track_style: (),
ends_style: (),
thumb_style: (fg: "blue"),
),
song_table_format: [
(
prop: (kind: Property(Artist),
default: (kind: Text("Unknown"))
),
width: "20%",
),
(
prop: (kind: Property(Title),
default: (kind: Text("Unknown"))
),
width: "35%",
),
(
prop: (kind: Property(Album), style: (fg: "white"),
default: (kind: Text("Unknown Album"), style: (fg: "white"))
),
width: "30%",
),
(
prop: (kind: Property(Duration),
default: (kind: Text("-"))
),
width: "15%",
alignment: Right,
),
],
components: {},
layout: Split(
direction: Vertical,
panes: [
(
pane: Pane(Header),
size: "2",
),
(
pane: Pane(Tabs),
size: "3",
),
(
pane: Pane(TabContent),
size: "100%",
),
(
pane: Pane(ProgressBar),
size: "1",
),
],
),
header: (
rows: [
(
left: [
(kind: Text("["), style: (fg: "yellow", modifiers: "Bold")),
(kind: Property(Status(StateV2(playing_label: "Playing", paused_label: "Paused", stopped_label: "Stopped"))), style: (fg: "yellow", modifiers: "Bold")),
(kind: Text("]"), style: (fg: "yellow", modifiers: "Bold"))
],
center: [
(kind: Property(Song(Title)), style: (modifiers: "Bold"),
default: (kind: Text("No Song"), style: (modifiers: "Bold"))
)
],
right: [
(kind: Property(Widget(ScanStatus)), style: (fg: "blue")),
(kind: Property(Widget(Volume)), style: (fg: "blue"))
]
),
(
left: [
(kind: Property(Status(Elapsed))),
(kind: Text(" / ")),
(kind: Property(Status(Duration))),
(kind: Text(" (")),
(kind: Property(Status(Bitrate))),
(kind: Text(" kbps)"))
],
center: [
(kind: Property(Song(Artist)), style: (fg: "yellow", modifiers: "Bold"),
default: (kind: Text("Unknown"), style: (fg: "yellow", modifiers: "Bold"))
),
(kind: Text(" - ")),
(kind: Property(Song(Album)),
default: (kind: Text("Unknown Album"))
)
],
right: [
(
kind: Property(Widget(States(
active_style: (fg: "white", modifiers: "Bold"),
separator_style: (fg: "white")))
),
style: (fg: "dark_gray")
),
]
),
],
),
browser_song_format: [
(
kind: Group([
(kind: Property(Track)),
(kind: Text(" ")),
])
),
(
kind: Group([
(kind: Property(Artist)),
(kind: Text(" - ")),
(kind: Property(Title)),
]),
default: (kind: Property(Filename))
),
],
lyrics: (
timestamp: false
)
)
'';
};
};
}

View File

@ -5,5 +5,5 @@
}:
with lib;
with mylib.modules; {
enable = mkEnableOption "Enable LaTeX";
enable = mkEnableOption "rmpc";
}

View File

@ -430,7 +430,7 @@ with mylib.networking; {
fish.enable = true;
firejail.enable = true; # Use to run app in network namespace (e.g. through vpn)
git.enable = true;
kdeconnect.enable = false; # Use this instead of HM for firewall setup
kdeconnect.enable = true; # Use this instead of HM for firewall setup
neovim.enable = true;
starship.enable = true;
# pay-respects.enable = true; # The new fuck