5 Commits

Author SHA1 Message Date
3d79cc84a3 Add gamescope (steam) login option
All checks were successful
Check Flake / check-flake (push) Successful in 6m48s
2026-03-09 22:32:10 -07:00
92a62e54c3 Initial KDE Plasma Bigscreen mode 2026-03-09 21:54:59 -07:00
bdec3793d0 Make PIA connection check more tollerant to hiccups
All checks were successful
Check Flake / check-flake (push) Successful in 15m39s
2026-03-08 21:02:50 -07:00
dac2820c58 Bump ntfy attachment expiry time
All checks were successful
Check Flake / check-flake (push) Successful in 15m28s
2026-03-08 12:43:19 -07:00
a84ca38b45 Disable bolt for now since I don't use it and it sometimes randomly hangs 2026-03-08 12:42:32 -07:00
14 changed files with 146 additions and 341 deletions

View File

@@ -270,10 +270,17 @@ in
return 0
}
MAX_RETRIES=4
for attempt in $(seq 1 $MAX_RETRIES); do
if check_vpn; then
rm -f "$COUNTER_FILE"
exit 0
fi
if [ "$attempt" -lt "$MAX_RETRIES" ]; then
echo "Attempt $attempt/$MAX_RETRIES failed, retrying in 5 minutes..." >&2
sleep 300
fi
done
# Failed read and update counter (reset if from a previous day)
today=$(date +%Y-%m-%d)
@@ -302,7 +309,7 @@ in
description = "Periodic PIA VPN connectivity check";
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "*:0/5";
OnCalendar = "*:0/30";
RandomizedDelaySec = "30s";
};
};

View File

@@ -6,7 +6,6 @@ in
{
imports = [
./kde.nix
./hyprland.nix
./yubikey.nix
./chromium.nix
./firefox.nix

View File

@@ -1,49 +0,0 @@
{ lib, config, pkgs, ... }:
let
cfg = config.de;
in
{
config = lib.mkIf cfg.enable {
programs.hyprland.enable = true;
programs.hyprland.withUWSM = true;
programs.hyprland.xwayland.enable = true;
xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-hyprland ];
environment.systemPackages = with pkgs; [
# Bar
waybar
# Launcher
wofi
# Notifications
mako
# Lock/idle
hyprlock
hypridle
# Wallpaper
hyprpaper
# Polkit
hyprpolkitagent
# Screenshots
grim
slurp
# Clipboard
wl-clipboard
cliphist
# Color picker
hyprpicker
# Brightness (laptop keybinds)
brightnessctl
];
};
}

View File

@@ -9,6 +9,14 @@ in
services.displayManager.sddm.wayland.enable = true;
services.desktopManager.plasma6.enable = true;
services.displayManager.sessionPackages = [
pkgs.plasma-bigscreen
];
# Bigscreen binaries must be on PATH for autostart services, KCMs, and
# internal plasmashell launches (settings, input handler, envmanager, etc.)
environment.systemPackages = [ pkgs.plasma-bigscreen ];
# kde apps
users.users.googlebot.packages = with pkgs; [
# akonadi

View File

@@ -8,6 +8,20 @@ in
programs.steam.enable = true;
hardware.steam-hardware.enable = true; # steam controller
# Login DE Option: Steam Gamescope (Steam Deck-like session)
programs.gamescope = {
enable = true;
};
programs.steam.gamescopeSession = {
enable = true;
args = [
"--hdr-enabled"
"--hdr-itm-enabled"
"--adaptive-sync"
];
};
environment.systemPackages = [ pkgs.gamescope-wsi ];
users.users.googlebot.packages = [
pkgs.steam
];

View File

@@ -18,6 +18,7 @@ in
auth-default-access = "deny-all";
behind-proxy = true;
enable-login = true;
attachment-expiry-duration = "48h";
};
# backups

View File

@@ -8,7 +8,6 @@ let
thisMachineIsPersonal = osConfig.thisMachine.hasRole."personal";
in
{
imports = [ ./hyprland.nix ];
home.username = "googlebot";
home.homeDirectory = "/home/googlebot";

View File

@@ -1,276 +0,0 @@
{ lib, osConfig, pkgs, ... }:
let
thisMachineIsPersonal = osConfig.thisMachine.hasRole."personal";
in
{
config = lib.mkIf thisMachineIsPersonal {
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = false; # Required when using UWSM
settings = {
"$mod" = "SUPER";
"$terminal" = "ghostty";
"$menu" = "wofi --show drun";
general = {
gaps_in = 5;
gaps_out = 10;
border_size = 2;
"col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
"col.inactive_border" = "rgba(595959aa)";
layout = "dwindle";
};
decoration = {
rounding = 10;
blur = {
enabled = true;
size = 3;
passes = 1;
};
shadow = {
enabled = true;
range = 4;
render_power = 3;
color = "rgba(1a1a1aee)";
};
};
animations = {
enabled = true;
bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
animation = [
"windows, 1, 7, myBezier"
"windowsOut, 1, 7, default, popin 80%"
"border, 1, 10, default"
"borderangle, 1, 8, default"
"fade, 1, 7, default"
"workspaces, 1, 6, default"
];
};
dwindle = {
pseudotile = true;
preserve_split = true;
};
input = {
follow_mouse = 1;
touchpad = {
natural_scroll = true;
};
};
misc = {
force_default_wallpaper = 0;
};
bind = [
# Applications
"$mod, Return, exec, $terminal"
"$mod, D, exec, $menu"
"$mod, L, exec, hyprlock"
# Window management
"$mod, Q, killactive"
"$mod, F, fullscreen"
"$mod, V, togglefloating"
"$mod, P, pseudo"
"$mod, J, togglesplit"
# Move focus
"$mod, left, movefocus, l"
"$mod, right, movefocus, r"
"$mod, up, movefocus, u"
"$mod, down, movefocus, d"
# Switch workspaces
"$mod, 1, workspace, 1"
"$mod, 2, workspace, 2"
"$mod, 3, workspace, 3"
"$mod, 4, workspace, 4"
"$mod, 5, workspace, 5"
"$mod, 6, workspace, 6"
"$mod, 7, workspace, 7"
"$mod, 8, workspace, 8"
"$mod, 9, workspace, 9"
"$mod, 0, workspace, 10"
# Move active window to workspace
"$mod SHIFT, 1, movetoworkspace, 1"
"$mod SHIFT, 2, movetoworkspace, 2"
"$mod SHIFT, 3, movetoworkspace, 3"
"$mod SHIFT, 4, movetoworkspace, 4"
"$mod SHIFT, 5, movetoworkspace, 5"
"$mod SHIFT, 6, movetoworkspace, 6"
"$mod SHIFT, 7, movetoworkspace, 7"
"$mod SHIFT, 8, movetoworkspace, 8"
"$mod SHIFT, 9, movetoworkspace, 9"
"$mod SHIFT, 0, movetoworkspace, 10"
# Scroll through workspaces
"$mod, mouse_down, workspace, e+1"
"$mod, mouse_up, workspace, e-1"
# Screenshots
", Print, exec, grim -g \"$(slurp)\" - | wl-copy"
"SHIFT, Print, exec, grim - | wl-copy"
# Clipboard history
"$mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy"
];
bindm = [
# Move/resize with mouse
"$mod, mouse:272, movewindow"
"$mod, mouse:273, resizewindow"
];
bindel = [
# Volume
", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
# Brightness
", XF86MonBrightnessUp, exec, brightnessctl s 10%+"
", XF86MonBrightnessDown, exec, brightnessctl s 10%-"
];
bindl = [
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
];
exec-once = [
"waybar"
"mako"
"hyprpaper"
"wl-paste --type text --watch cliphist store"
"wl-paste --type image --watch cliphist store"
];
};
};
# Waybar
programs.waybar = {
enable = true;
settings = {
mainBar = {
layer = "top";
position = "top";
height = 30;
modules-left = [ "hyprland/workspaces" ];
modules-center = [ "clock" ];
modules-right = [ "network" "pulseaudio" "battery" "tray" ];
clock = {
format = "{:%H:%M %Y-%m-%d}";
};
battery = {
format = "{capacity}% {icon}";
format-icons = [ "" "" "" "" "" ];
};
network = {
format-wifi = "{essid} ({signalStrength}%) ";
format-ethernet = "{ipaddr}/{cidr} ";
format-disconnected = "Disconnected ";
};
pulseaudio = {
format = "{volume}% {icon}";
format-muted = "";
format-icons = {
default = [ "" "" "" ];
};
on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
};
tray = {
spacing = 10;
};
};
};
};
# Notifications
services.mako = {
enable = true;
settings = {
default-timeout = 5000;
border-radius = 5;
};
};
# Idle daemon
services.hypridle = {
enable = true;
settings = {
general = {
lock_cmd = "pidof hyprlock || hyprlock";
before_sleep_cmd = "loginctl lock-session";
after_sleep_cmd = "hyprctl dispatch dpms on";
};
listener = [
{
timeout = 300;
on-timeout = "loginctl lock-session";
}
{
timeout = 330;
on-timeout = "hyprctl dispatch dpms off";
on-resume = "hyprctl dispatch dpms on";
}
{
timeout = 1800;
on-timeout = "systemctl suspend";
}
];
};
};
# Lock screen
programs.hyprlock = {
enable = true;
settings = {
general = {
hide_cursor = true;
grace = 5;
};
background = [
{
monitor = "";
color = "rgba(25, 20, 20, 1.0)";
blur_passes = 2;
blur_size = 7;
}
];
input-field = [
{
monitor = "";
size = "200, 50";
outline_thickness = 3;
dots_size = 0.33;
dots_spacing = 0.15;
outer_color = "rgb(151515)";
inner_color = "rgb(200, 200, 200)";
font_color = "rgb(10, 10, 10)";
fade_on_empty = true;
placeholder_text = "<i>Password...</i>";
hide_input = false;
position = "0, -20";
halign = "center";
valign = "center";
}
];
};
};
};
}

View File

@@ -18,7 +18,7 @@
boot.extraModulePackages = [ ];
# thunderbolt
services.hardware.bolt.enable = true;
services.hardware.bolt.enable = false;
# firmware
firmware.x86_64.enable = true;

View File

@@ -22,7 +22,7 @@
boot.extraModulePackages = [ ];
# thunderbolt
services.hardware.bolt.enable = true;
services.hardware.bolt.enable = false;
# firmware
firmware.x86_64.enable = true;

View File

@@ -5,10 +5,6 @@
./hardware-configuration.nix
];
# Login DE Option: Steam
programs.steam.gamescopeSession.enable = true;
# programs.gamescope.capSysNice = true;
# Login DE Option: Kodi
services.xserver.desktopManager.kodi.enable = true;
services.xserver.desktopManager.kodi.package =
@@ -35,7 +31,7 @@
"L+ /opt/rocm/hip - - - - ${pkgs.rocmPackages.clr}"
];
services.displayManager.defaultSession = "plasma";
services.displayManager.defaultSession = "plasma-bigscreen-wayland";
users.users.cris = {
isNormalUser = true;
@@ -54,10 +50,10 @@
uid = 1002;
};
# Auto login into Plasma in john zoidberg account
# Auto login into Plasma Bigscreen in john zoidberg account
services.displayManager.sddm.settings = {
Autologin = {
Session = "plasma";
Session = "plasma-bigscreen-wayland";
User = "john";
};
};

View File

@@ -31,4 +31,12 @@ in
../patches/music-assistant-zeroconf-port.patch
];
});
# Plasma Bigscreen: TV-optimized KDE shell (not yet packaged in nixpkgs)
plasma-bigscreen = import ./plasma-bigscreen.nix {
inherit (prev.kdePackages)
mkKdeDerivation plasma-workspace plasma-wayland-protocols
qtmultimedia qtwayland qtwebengine qcoro;
inherit (prev) lib fetchFromGitLab pkg-config sdl3 libcec wayland;
};
}

View File

@@ -0,0 +1,79 @@
{
mkKdeDerivation,
lib,
fetchFromGitLab,
pkg-config,
plasma-workspace,
qtmultimedia,
qtwayland,
qtwebengine,
qcoro,
plasma-wayland-protocols,
wayland,
sdl3,
libcec,
}:
mkKdeDerivation {
pname = "plasma-bigscreen";
version = "unstable-2026-03-07";
src = fetchFromGitLab {
domain = "invent.kde.org";
owner = "plasma";
repo = "plasma-bigscreen";
rev = "bd143fea7e386bac1652b8150a3ed3d5ef7cf93c";
hash = "sha256-y439IX7e0+XqxqFj/4+P5le0hA7DiwA+smDsD0UH/fI=";
};
patches = [
../patches/plasma-bigscreen-input-handler-app-id.patch
];
extraNativeBuildInputs = [ pkg-config ];
extraBuildInputs = [
qtmultimedia
qtwayland
qtwebengine
qcoro
plasma-wayland-protocols
wayland
sdl3
libcec
];
# Match project version to installed Plasma release so cmake version checks pass
postPatch = ''
substituteInPlace CMakeLists.txt \
--replace-fail 'set(PROJECT_VERSION "6.5.80")' \
'set(PROJECT_VERSION "${plasma-workspace.version}")'
# Upstream references a nonexistent startplasma-waylandsession binary.
# Fix this in the cmake template (before @KDE_INSTALL_FULL_LIBEXECDIR@ is substituted).
substituteInPlace bin/plasma-bigscreen-wayland.in \
--replace-fail \
'startplasma-wayland --xwayland --libinput --exit-with-session=@KDE_INSTALL_FULL_LIBEXECDIR@/startplasma-waylandsession' \
'startplasma-wayland'
'';
# FIXME: work around Qt 6.10 cmake API changes
cmakeFlags = [ "-DQT_FIND_PRIVATE_MODULES=1" ];
# QML lint fails on missing runtime-only imports (org.kde.private.biglauncher)
# that are only available inside a running Plasma session
dontQmlLint = true;
postFixup = ''
# Session .desktop references $out/libexec/plasma-dbus-run-session-if-needed
# but the binary lives in plasma-workspace
substituteInPlace "$out/share/wayland-sessions/plasma-bigscreen-wayland.desktop" \
--replace-fail \
"$out/libexec/plasma-dbus-run-session-if-needed" \
"${plasma-workspace}/libexec/plasma-dbus-run-session-if-needed"
'';
passthru.providedSessions = [ "plasma-bigscreen-wayland" ];
meta.license = with lib.licenses; [ gpl2Plus ];
}

View File

@@ -0,0 +1,19 @@
Use the correct app_id when pre-authorizing remote-desktop portal access.
The portal's isAppMegaAuthorized() looks up the caller's specific app_id in
the PermissionStore. An empty string only matches apps the portal cannot
identify; it is not a wildcard. Since the input handler is launched via
KIO::CommandLauncherJob with a desktopName, the portal resolves it to the
desktop file ID, so the empty-string entry never matches.
--- a/inputhandler/xdgremotedesktopsystem.cpp
+++ b/inputhandler/xdgremotedesktopsystem.cpp
@@ -66,7 +67,7 @@
QDBusReply<void> reply = permissionStore.call(QStringLiteral("SetPermission"),
QStringLiteral("kde-authorized"), // table
true, // create table if not exists
QStringLiteral("remote-desktop"), // id
- QLatin1String(""), // app (empty for host applications)
+ QStringLiteral("org.kde.plasma.bigscreen.inputhandler"),
QStringList{QStringLiteral("yes")}); // permissions