aboutsummaryrefslogtreecommitdiffstats
path: root/home
diff options
context:
space:
mode:
authorPetri Hienonen <petri.hienonen@gmail.com>2025-12-30 17:15:55 +0200
committerPetri Hienonen <petri.hienonen@gmail.com>2025-12-30 17:15:55 +0200
commitcc9ab595bab3a76fe67d9e8ec88448b1e407a721 (patch)
treebd6d11d0bee5c749964e6bfc91652c61faa72c64 /home
parentfd6e6d96a8f9048676af65fa027f41de9fee9b95 (diff)
downloadnixos-cc9ab595bab3a76fe67d9e8ec88448b1e407a721.tar.zst
Split configurations into separate modules
Diffstat (limited to 'home')
-rw-r--r--home/bt.nix81
-rw-r--r--home/default.nix209
-rw-r--r--home/goose.nix74
-rw-r--r--home/nom.nix20
-rw-r--r--home/ntfy.nix40
5 files changed, 219 insertions, 205 deletions
diff --git a/home/bt.nix b/home/bt.nix
new file mode 100644
index 0000000..b41950a
--- /dev/null
+++ b/home/bt.nix
@@ -0,0 +1,81 @@
+{ config, pkgs, ... }:
+{
+
+ systemd.user.services.bt-notify = {
+ Unit = {
+ Description = "Bluetooth Connection & Battery Notifications";
+ After = [ "graphical-session.target" ];
+ ConditionPathExists = "${config.home.homeDirectory}/.local/bin/bt-notify.sh";
+ };
+ Install = {
+ WantedBy = [ "graphical-session.target" ];
+ };
+ Service = {
+ Type = "simple";
+ ExecStart = "${config.home.homeDirectory}/.local/bin/bt-notify.sh";
+ Restart = "always";
+ RestartSec = 5;
+ };
+ };
+
+ home.file."/.local/bin/bt-notify.sh" = {
+ source = pkgs.writeShellScript "bt-notify" ''
+ set -euo pipefail
+
+ # Temporary file to remember which devices were connected last loop
+ STATE_FILE="/tmp/bt-connected-state"
+
+ # Ensure the file exists
+ touch "$STATE_FILE"
+
+ # Listen to BlueZ D-Bus signals AND poll for battery (some devices only report on poll)
+ (
+ # D-Bus listener (connection events)
+ ${pkgs.dbus}/bin/dbus-monitor "interface=org.bluez.Device1,member=PropertiesChanged" --system &
+
+ # Polling loop for battery (runs in background)
+ while true; do
+ ${pkgs.bluez}/bin/bluetoothctl devices | cut -f2 -d' ' | while read -r mac; do
+ info=$(${pkgs.bluez}/bin/bluetoothctl info "$mac")
+ name=$(echo "$info" | grep -i "Alias" | cut -d' ' -f2-)
+ connected=$(echo "$info" | grep -i "Connected" | awk '{print $2}')
+ battery_line=$(echo "$info" | grep -i "Battery Percentage" || true)
+ battery=$(echo "$battery_line" | awk '{print $3}' | tr -d '()')
+
+ # --- Connection change detection ---
+ if [[ "$connected" == "yes" ]] && ! grep -q "^$mac$" "$STATE_FILE"; then
+ ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Connected" "$name"
+ echo "$mac" >> "$STATE_FILE"
+ elif [[ "$connected" == "no" ]] && grep -q "^$mac$" "$STATE_FILE"; then
+ ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Disconnected" "$name"
+ sed -i "/^$mac$/d" "$STATE_FILE"
+ fi
+
+ # --- Low battery warning ---
+ if [[ -n "$battery" && "$battery" -lt 20 ]]; then
+ ${pkgs.libnotify}/bin/notify-send -u critical -a "Bluetooth" "Low Battery" "$name: ''${battery}%"
+ fi
+ done
+ sleep 10
+ done &
+ ) | while read -r line; do
+ # Parse D-Bus PropertiesChanged for Connected
+ if echo "$line" | grep -q '"Connected"'; then
+ path=$(echo "$line" | grep -oP 'path="\K[^"]+')
+ mac=$(basename "$path")
+ info=$(${pkgs.bluez}/bin/bluetoothctl info "$mac")
+ name=$(echo "$info" | grep -i "Alias" | cut -d' ' -f2-)
+ connected=$(echo "$info" | grep -i "Connected" | awk '{print $2}')
+
+ if [[ "$connected" == "yes" ]] && ! grep -q "^$mac$" "$STATE_FILE"; then
+ ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Connected" "$name"
+ echo "$mac" >> "$STATE_FILE"
+ elif [[ "$connected" == "no" ]] && grep -q "^$mac$" "$STATE_FILE"; then
+ ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Disconnected" "$name"
+ sed -i "/^$mac$/d" "$STATE_FILE"
+ fi
+ fi
+ done
+ '';
+ };
+}
diff --git a/home/default.nix b/home/default.nix
index 21dbf53..7446be3 100644
--- a/home/default.nix
+++ b/home/default.nix
@@ -15,6 +15,7 @@ in
imports = [
# ./quickshell
(import ./nvim { inherit unstable; })
+ ./bt.nix
./cargo.nix
./chromium.nix
./dav
@@ -23,11 +24,14 @@ in
./firefox.nix
./fish.nix
./git.nix
+ ./goose.nix
./hyprland.nix
./hyprlock.nix
./mail
./mpv.nix
./newsboat.nix
+ ./nom.nix
+ ./ntfy.nix
./nushell.nix
./tenere.nix
./ticker.nix
@@ -567,47 +571,6 @@ in
startServices = "sd-switch";
};
- xdg.configFile."nom/config.yml".text = ''
- autoread: true
- ordering: desc
- showread: false
- openers:
- - regex: "youtube"
- cmd: "mpv %s"
- - regex: ".*"
- cmd: "${pkgs.firefox}/bin/firefox %s"
- refreshinterval: 5
- filtering:
- defaultIncludeFeedName: true
- backends:
- miniflux:
- host: https://flux.tammi.cc
- api_key: $(${pkgs.coreutils}/bin/cat ${config.age.secrets.miniflux_api_key.path})
- '';
-
- systemd.user.services.ntfy-client = {
- Unit = {
- Description = "ntfy client subscriber";
- After = [ "graphical.target" ];
- };
-
- Install = {
- WantedBy = [ "default.target" ];
- };
-
- Service = {
- ExecStart = "${pkgs.ntfy-sh}/bin/ntfy subscribe --config /home/petri/.config/ntfy/client.yml --from-config";
- Restart = "on-failure";
- RestartSec = "10s";
- ProtectSystem = "strict";
- ProtectHome = "read-only";
- PrivateTmp = true;
- NoNewPrivileges = true;
- RestrictRealtime = true;
- LockPersonality = true;
- };
- };
-
xdg.configFile."xdg-desktop-portal-termfilechooser/config".source =
(pkgs.formats.toml { }).generate "termfilechooser-config"
{
@@ -667,168 +630,4 @@ in
fi
'';
};
-
- systemd.user.services.bt-notify = {
- Unit = {
- Description = "Bluetooth Connection & Battery Notifications";
- After = [ "graphical-session.target" ];
- ConditionPathExists = "${config.home.homeDirectory}/.local/bin/bt-notify.sh";
- };
- Install = {
- WantedBy = [ "graphical-session.target" ];
- };
- Service = {
- Type = "simple";
- ExecStart = "${config.home.homeDirectory}/.local/bin/bt-notify.sh";
- Restart = "always";
- RestartSec = 5;
- };
- };
-
- home.file."/.local/bin/bt-notify.sh" = {
- source = pkgs.writeShellScript "bt-notify" ''
- set -euo pipefail
-
- # Temporary file to remember which devices were connected last loop
- STATE_FILE="/tmp/bt-connected-state"
-
- # Ensure the file exists
- touch "$STATE_FILE"
-
- # Listen to BlueZ D-Bus signals AND poll for battery (some devices only report on poll)
- (
- # D-Bus listener (connection events)
- ${pkgs.dbus}/bin/dbus-monitor "interface=org.bluez.Device1,member=PropertiesChanged" --system &
-
- # Polling loop for battery (runs in background)
- while true; do
- ${pkgs.bluez}/bin/bluetoothctl devices | cut -f2 -d' ' | while read -r mac; do
- info=$(${pkgs.bluez}/bin/bluetoothctl info "$mac")
- name=$(echo "$info" | grep -i "Alias" | cut -d' ' -f2-)
- connected=$(echo "$info" | grep -i "Connected" | awk '{print $2}')
- battery_line=$(echo "$info" | grep -i "Battery Percentage" || true)
- battery=$(echo "$battery_line" | awk '{print $3}' | tr -d '()')
-
- # --- Connection change detection ---
- if [[ "$connected" == "yes" ]] && ! grep -q "^$mac$" "$STATE_FILE"; then
- ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Connected" "$name"
- echo "$mac" >> "$STATE_FILE"
- elif [[ "$connected" == "no" ]] && grep -q "^$mac$" "$STATE_FILE"; then
- ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Disconnected" "$name"
- sed -i "/^$mac$/d" "$STATE_FILE"
- fi
-
- # --- Low battery warning ---
- if [[ -n "$battery" && "$battery" -lt 20 ]]; then
- ${pkgs.libnotify}/bin/notify-send -u critical -a "Bluetooth" "Low Battery" "$name: ''${battery}%"
- fi
- done
- sleep 10
- done &
- ) | while read -r line; do
- # Parse D-Bus PropertiesChanged for Connected
- if echo "$line" | grep -q '"Connected"'; then
- path=$(echo "$line" | grep -oP 'path="\K[^"]+')
- mac=$(basename "$path")
- info=$(${pkgs.bluez}/bin/bluetoothctl info "$mac")
- name=$(echo "$info" | grep -i "Alias" | cut -d' ' -f2-)
- connected=$(echo "$info" | grep -i "Connected" | awk '{print $2}')
-
- if [[ "$connected" == "yes" ]] && ! grep -q "^$mac$" "$STATE_FILE"; then
- ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Connected" "$name"
- echo "$mac" >> "$STATE_FILE"
- elif [[ "$connected" == "no" ]] && grep -q "^$mac$" "$STATE_FILE"; then
- ${pkgs.libnotify}/bin/notify-send -a "Bluetooth" "Disconnected" "$name"
- sed -i "/^$mac$/d" "$STATE_FILE"
- fi
- fi
- done
- '';
- };
-
- xdg.configFile."goose/config.yaml".source = (pkgs.formats.yaml { }).generate "goose-config" {
- OPENAI_BASE_PATH = "v1/chat/completions";
- extensions = {
- developer = {
- available_tools = [ ];
- bundled = true;
- description = null;
- display_name = "Developer";
- enabled = true;
- name = "developer";
- timeout = 300;
- type = "builtin";
- };
- computercontroller = {
- bundled = true;
- display_name = "Computer Controller";
- enabled = true;
- name = "computercontroller";
- timeout = 300;
- type = "builtin";
- };
- memory = {
- available_tools = [ ];
- bundled = true;
- description = "Tools to save and retrieve durable memories";
- display_name = "Memory";
- enabled = true;
- name = "memory";
- timeout = 80;
- type = "builtin";
- };
- todo = {
- available_tools = [ ];
- bundled = true;
- description = "Enable a todo list for Goose so it can keep track of what it is doing";
- enabled = true;
- name = "todo";
- type = "platform";
- };
- chatrecall = {
- available_tools = [ ];
- bundled = true;
- description = "Search past conversations and load session summaries for contextual memory";
- enabled = true;
- name = "chatrecall";
- type = "platform";
- };
- extensionmanager = {
- available_tools = [ ];
- bundled = true;
- description = "Enable extension management tools for discovering, enabling, and disabling extensions";
- enabled = true;
- name = "Extension Manager";
- type = "platform";
- };
- autovisualiser = {
- available_tools = [ ];
- bundled = true;
- description = "Data visualisation and UI generation tools";
- display_name = "Auto Visualiser";
- enabled = true;
- name = "autovisualiser";
- timeout = 300;
- type = "builtin";
- };
- };
- GOOSE_MODE = "auto";
- GOOSE_PROVIDER = "openai";
- GOOSE_MODEL = "gpt-4.1-mini";
- OPENAI_HOST = "https://api.openai.com";
- };
-
- xdg.configFile."ntfy/client.yml".source = (pkgs.formats.yaml { }).generate "ntfy-client-config" {
- "default-host" = "https://ntfy.tammi.cc";
- subscribe = [
- {
- topic = "77WxlkfsTzGrbYFw";
- host = "https://ntfy.tammi.cc";
- since = "1h";
- persist = true;
- keepalive = "45s";
- format = "markdown";
- }
- ];
- };
}
diff --git a/home/goose.nix b/home/goose.nix
new file mode 100644
index 0000000..0e23453
--- /dev/null
+++ b/home/goose.nix
@@ -0,0 +1,74 @@
+{ config, pkgs, ... }:
+{
+ xdg.configFile."goose/config.yaml".source = (pkgs.formats.yaml { }).generate "goose-config" {
+ OPENAI_BASE_PATH = "v1/chat/completions";
+ extensions = {
+ developer = {
+ available_tools = [ ];
+ bundled = true;
+ description = null;
+ display_name = "Developer";
+ enabled = true;
+ name = "developer";
+ timeout = 300;
+ type = "builtin";
+ };
+ computercontroller = {
+ bundled = true;
+ display_name = "Computer Controller";
+ enabled = true;
+ name = "computercontroller";
+ timeout = 300;
+ type = "builtin";
+ };
+ memory = {
+ available_tools = [ ];
+ bundled = true;
+ description = "Tools to save and retrieve durable memories";
+ display_name = "Memory";
+ enabled = true;
+ name = "memory";
+ timeout = 80;
+ type = "builtin";
+ };
+ todo = {
+ available_tools = [ ];
+ bundled = true;
+ description = "Enable a todo list for Goose so it can keep track of what it is doing";
+ enabled = true;
+ name = "todo";
+ type = "platform";
+ };
+ chatrecall = {
+ available_tools = [ ];
+ bundled = true;
+ description = "Search past conversations and load session summaries for contextual memory";
+ enabled = true;
+ name = "chatrecall";
+ type = "platform";
+ };
+ extensionmanager = {
+ available_tools = [ ];
+ bundled = true;
+ description = "Enable extension management tools for discovering, enabling, and disabling extensions";
+ enabled = true;
+ name = "Extension Manager";
+ type = "platform";
+ };
+ autovisualiser = {
+ available_tools = [ ];
+ bundled = true;
+ description = "Data visualisation and UI generation tools";
+ display_name = "Auto Visualiser";
+ enabled = true;
+ name = "autovisualiser";
+ timeout = 300;
+ type = "builtin";
+ };
+ };
+ GOOSE_MODE = "auto";
+ GOOSE_PROVIDER = "openai";
+ GOOSE_MODEL = "gpt-4.1-mini";
+ OPENAI_HOST = "https://api.openai.com";
+ };
+}
diff --git a/home/nom.nix b/home/nom.nix
new file mode 100644
index 0000000..b1ceffc
--- /dev/null
+++ b/home/nom.nix
@@ -0,0 +1,20 @@
+{ config, pkgs, ... }:
+{
+ xdg.configFile."nom/config.yml".text = ''
+ autoread: true
+ ordering: desc
+ showread: false
+ openers:
+ - regex: "youtube"
+ cmd: "mpv %s"
+ - regex: ".*"
+ cmd: "${pkgs.firefox}/bin/firefox %s"
+ refreshinterval: 5
+ filtering:
+ defaultIncludeFeedName: true
+ backends:
+ miniflux:
+ host: https://flux.tammi.cc
+ api_key: $(${pkgs.coreutils}/bin/cat ${config.age.secrets.miniflux_api_key.path})
+ '';
+}
diff --git a/home/ntfy.nix b/home/ntfy.nix
new file mode 100644
index 0000000..06f0d38
--- /dev/null
+++ b/home/ntfy.nix
@@ -0,0 +1,40 @@
+{ config, pkgs, ... }:
+{
+
+ systemd.user.services.ntfy-client = {
+ Unit = {
+ Description = "ntfy client subscriber";
+ After = [ "graphical.target" ];
+ };
+
+ Install = {
+ WantedBy = [ "default.target" ];
+ };
+
+ Service = {
+ ExecStart = "${pkgs.ntfy-sh}/bin/ntfy subscribe --config /home/petri/.config/ntfy/client.yml --from-config";
+ Restart = "on-failure";
+ RestartSec = "10s";
+ ProtectSystem = "strict";
+ ProtectHome = "read-only";
+ PrivateTmp = true;
+ NoNewPrivileges = true;
+ RestrictRealtime = true;
+ LockPersonality = true;
+ };
+ };
+
+ xdg.configFile."ntfy/client.yml".source = (pkgs.formats.yaml { }).generate "ntfy-client-config" {
+ "default-host" = "https://ntfy.tammi.cc";
+ subscribe = [
+ {
+ topic = "77WxlkfsTzGrbYFw";
+ host = "https://ntfy.tammi.cc";
+ since = "1h";
+ persist = true;
+ keepalive = "45s";
+ format = "markdown";
+ }
+ ];
+ };
+}