{ config, lib, pkgs, ... }: let inherit (lib) mkIf; browser = lib.getExe config.apps.browser; webAppLauncher = pkgs.writeShellScript "web-app-launcher" '' browser="${browser}" browser_exec="" for path in ~/.local ~/.nix-profile /usr; do if [ -f "$path/share/applications/$browser.desktop" ]; then browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' "$path/share/applications/$browser.desktop" 2>/dev/null | head -1) break fi done if [ -z "$browser_exec" ]; then browser_exec="${browser}" fi url="$1" app_name="''${2:-$(basename "$0")}" shift 2 exec setsid "$browser_exec" \ --app="$url" \ --user-data-dir="$HOME/.local/share/web-apps/$app_name" \ --no-first-run \ --no-default-browser-check \ --disable-background-timer-throttling \ --disable-backgrounding-occluded-windows \ --disable-renderer-backgrounding \ --enable-quic \ --quic-version=h3-29 \ --enable-features=UseOzonePlatform,WaylandWindowDecorations,WaylandPerWindowScaling,WaylandTextInputV3,WebRTCPipeWireCapturer \ --disable-features=WebRtcAllowInputVolumeAdjustment \ --ozone-platform=wayland \ --gtk-version=4 \ --enable-experimental-web-platform-features \ "$@" ''; # Create web app package createWebApp = { name, url, icon, description ? "", categories ? [ "Network" "Chat" "InstantMessaging" ], }: let pkgName = "${lib.replaceStrings [ " " ] [ "-" ] (lib.toLower name)}-web-app"; in { name = pkgName; value = pkgs.stdenv.mkDerivation { pname = pkgName; version = "1.0"; dontUnpack = true; nativeBuildInputs = [ pkgs.copyDesktopItems pkgs.makeWrapper ]; installPhase = '' runHook preInstall makeWrapper ${webAppLauncher} $out/bin/${pkgName} \ --add-flags "${url}" \ --add-flags "${pkgName}" runHook postInstall ''; desktopItems = [ (pkgs.makeDesktopItem { inherit icon categories; name = pkgName; exec = "${pkgName} %U"; desktopName = name; comment = description; startupNotify = true; startupWMClass = pkgName; }) ]; }; }; apps = builtins.listToAttrs ( map createWebApp [ { name = "Cinny"; url = "https://chat.lobotomise.me"; icon = "cinny"; description = "Cinny, a Matrix client"; } { name = "Discord"; url = "https://discord.com/app"; icon = "discord"; description = "Discord Web"; } { name = "FB Messenger"; url = "https://m.me"; icon = "facebook"; description = "Facebook Messenger"; } ] ); in { config = { environment.systemPackages = builtins.attrValues apps; xdg.mime.defaultApplications = { "x-scheme-handler/matrix" = "cinny-web-app.desktop"; }; environment.etc."web-apps-setup".text = '' mkdir -p /home/*/.local/share/web-apps ''; }; }