diff --git a/environments/river/default.nix b/environments/river/default.nix deleted file mode 100644 index ce84f03..0000000 --- a/environments/river/default.nix +++ /dev/null @@ -1,52 +0,0 @@ -{ - pkgs, - user, - ... -}: { - imports = [ - ../../modules/wm - ../../modules/gui - ]; - - programs.uwsm = { - enable = true; - waylandCompositors = { - river = { - prettyName = "river"; - comment = "river compositor managed by UWSM"; - binPath = "${pkgs.river}/bin/river"; - }; - }; - }; - - services.greetd = { - enable = true; - settings = { - default_session = { - command = "${pkgs.greetd.greetd}/bin/agreety --cmd zsh"; - user = "greeter"; - }; - initial_session = { - command = "uwsm start -S river-uwsm.desktop"; - user = user; - }; - }; - }; - - # Without this, greetd would depend on graphical.target & would get activated before - # uwsm. This leads to a race that can: - # - fail startup & retry it (leading to a ~10s delay) - # - make graphical services start before river. - # To prevent those issue, simply target the default tty & greetd's inital_session will - # start uwsm & end up reaching graphical.target - # systemd.defaultUnit = lib.mkForce "multi-user.target"; - - - xdg.portal = { - enable = true; - wlr.enable = true; - # gtk portal needed to make gtk apps happy - extraPortals = [pkgs.xdg-desktop-portal-gtk]; - config.common.default = "*"; - }; -} diff --git a/environments/river/home.nix b/environments/river/home.nix deleted file mode 100644 index 20a7aae..0000000 --- a/environments/river/home.nix +++ /dev/null @@ -1,231 +0,0 @@ -{ - pkgs, - config, - ... -}: let - cliphist = "${pkgs.cliphist}/bin/cliphist"; - common_binds = { - "None XF86AudioRaiseVolume" = "spawn '${pkgs.pamixer}/bin/pamixer -i 5'"; - "None XF86AudioLowerVolume" = "spawn '${pkgs.pamixer}/bin/pamixer -d 5'"; - "None XF86AudioMute" = "spawn '${pkgs.pamixer}/bin/pamixer --toggle-mute'"; - "None XF86AudioMedia" = "spawn '${pkgs.playerctl}/bin/playerctl play-pause'"; - "None XF86AudioPlay" = "spawn '${pkgs.playerctl}/bin/playerctl play-pause'"; - "None XF86AudioPause" = "spawn '${pkgs.playerctl}/bin/playerctl play-pause'"; - "None XF86AudioPrev" = "spawn '${pkgs.playerctl}/bin/playerctl playerctl previous'"; - "None XF86AudioNext" = "spawn '${pkgs.playerctl}/bin/playerctl playerctl next'"; - "None XF86MonBrightnessUp" = "spawn '${pkgs.brightnessctl}/bin/brightnessctl s +5%'"; - "None XF86MonBrightnessDown" = "spawn '${pkgs.brightnessctl}/bin/brightnessctl s 5%-'"; - }; -in { - imports = [ - ../../modules/gui/home.nix - ../../modules/wm/home.nix - ]; - - systemd.user.services.polkit-gnome-authentication-agent-1 = { - Unit = { - Description = "polkit-gnome-authentication-agent-1"; - Wants = ["graphical-session.target"]; - After = ["graphical-session.target"]; - }; - Install = { - WantedBy = ["graphical-session.target"]; - }; - Service = { - Type = "simple"; - ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; - Restart = "on-failure"; - RestartSec = 1; - TimeoutStopSec = 10; - }; - }; - - xdg.configFile."river-luatile/layout.lua".source = ./layout.lua; - - wayland.windowManager.river = { - enable = true; - extraSessionVariables = { - XDG_CURRENT_DESKTOP = "river"; - }; - settings = { - default-layout = "luatile"; - spawn = [ - "${pkgs.river-luatile}/bin/river-luatile" - "wallpaper" - "ags" - ]; - - default-attach-mode = "top"; - focus-follows-cursor = "normal"; - set-cursor-warp = "on-focus-change"; - - hide-cursor = { - when-typing = true; - }; - set-repeat = "25 600"; - keyboard-layout = "-options 'caps:escape_shifted_capslock' us"; - input = { - "'*'" = { - events = true; - accel-profile = "adaptive"; - pointer-accel = 0; - click-method = "button-areas"; - tap = true; - drag = true; - disable-while-typing = true; - middle-emulation = true; - natural-scroll = true; - tap-button-map = "left-right-middle"; - scroll-method = "two-finger"; - }; - "'*Mouse'" = { - natural-scroll = "disabled"; - }; - "'*Vertical'" = { - natural-scroll = "disabled"; - }; - }; - - # border-color-focused = "0x94e2d5"; - # border-color-unfocused = "0x00000000"; - # border-color-urgent = "0xcba6f7"; - border-width = 0; - - rule-add = { - "-app-id" = { - "discord" = "tags $((1 << 2))"; - "vesktop" = "tags $((1 << 2))"; - "'YouTube Music'" = "tags $((1 << 1))"; - # disable all client side decorations - "'*'" = "ssd"; - }; - }; - - declare-mode = ["normal" "locked" "passthrough"]; - map = { - normal = - { - "Super+Shift Q" = "exit"; - "Super C" = "close"; - - "Super K" = "focus-view next"; - "Super J" = "focus-view previous"; - "Super+Shift K" = "swap previous"; - "Super+Shift J" = "swap previous"; - "Super Return" = "zoom"; - - "Super Period" = "focus-output next"; - "Super Comma" = "focus-output previous"; - "Super+Shift Period" = "send-to-output -current-tags next"; - "Super+Shift Comma" = "send-to-output -current-tags previous"; - "Super+Control+Shift Period" = "send-to-output next"; - "Super+Control+Shift Comma" = "send-to-output previous"; - - "Super H" = "send-layout-cmd luatile 'set_mfact(-0.05)'"; - "Super L" = "send-layout-cmd luatile 'set_mfact( 0.05)'"; - "Super U" = "send-layout-cmd luatile 'set_mcount(-1)'"; - "Super I" = "send-layout-cmd luatile 'set_mcount( 1)'"; - - "Super T" = "send-layout-cmd luatile 'set_layout(\"tiling\")'"; - "Super M" = "send-layout-cmd luatile 'set_layout(\"monocle\")'"; - "Super D" = "send-layout-cmd luatile 'set_layout(\"deck\")'"; - "Super F" = "toggle-fullscreen"; - "Super+Shift F" = "toggle-float"; - - "Super R" = "spawn 'uwsm app -- ${config.home.sessionVariables.BROWSER}'"; - "Super E" = "spawn 'uwsm app -- ${config.home.sessionVariables.TERMINAL}'"; - "Super P" = ''spawn 'rofi -show drun -show-icons -run-command "uwsm app -- {cmd}"' ''; - "Super X" = "spawn 'screenshot'"; - "Super+Control X" = "spawn 'screenshot-freeze'"; - "Super+Shift X" = "spawn 'uwsm app -- record'"; - "Super B" = "spawn '${pkgs.hyprpicker}/bin/hyprpicker | wl-copy'"; - "Super V" = "spawn '${cliphist} list | rofi -dmenu -display-columns 2 | ${cliphist} decode | wl-copy'"; - "Super+Shift L" = "spawn 'loginctl lock-session'"; - - "Super+Shift Backslash" = "enter-mode passthrough"; - } - // common_binds; - locked = common_binds; - passthrough = { - "Super+Shift Backslash" = "enter-mode normal"; - }; - }; - map-pointer = { - normal = { - "Super+Shift BTN_LEFT" = "move-view"; - "Super+Shift BTN_RIGHT" = "resize-view"; - }; - }; - }; - extraConfig = '' - for i in $(seq 1 9) - do - tags=$((1 << (i - 1))) - riverctl map normal Super "$i" set-focused-tags -alternate $tags - riverctl map normal Super+Shift "$i" set-view-tags $tags - riverctl map normal Super+Control "$i" toggle-focused-tags $tags - riverctl map normal Super+Shift+Control "$i" toggle-view-tags $tags - done - - all_tags=$(((1 << 32) - 1)) - riverctl map normal Super 0 set-focused-tags -alternate "$all_tags" - riverctl map normal Super+Shift 0 set-view-tags "$all_tags" - - # Focus second screen by default (also spawn apps there) - riverctl focus-output DP-1 - riverctl set-focused-tags $((1 << 3)) - - ${pkgs.uwsm}/bin/uwsm finalize DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP NIXOS_OZONE_WL XCURSOR_THEME XCURSOR_SIZE - hyprlock --immediate - ''; - - # we use uwsm instead. - systemd.enable = false; - }; - - home.packages = with pkgs; [ - gnome-control-center - gnome-weather - wdisplays - ]; - - services.kanshi = { - enable = true; - systemdTarget = "graphical-session.target"; - settings = [ - { - output.criteria = "eDP-1"; - output.scale = 1.6; - } - { - profile.name = "undocked"; - profile.outputs = [ - { - criteria = "eDP-1"; - status = "enable"; - } - ]; - } - { - profile.name = "docked"; - profile.outputs = [ - { - criteria = "eDP-1"; - status = "disable"; - } - { - criteria = "Dell Inc. DELL S2722QC 2HHZH24"; - # position = "1500,0"; - position = "0,900"; - scale = 1.7; - } - { - criteria = "*"; - position = "0,0"; - scale = 1.4; - } - ]; - } - ]; - }; -} diff --git a/environments/river/layout.lua b/environments/river/layout.lua deleted file mode 100644 index 492bb0c..0000000 --- a/environments/river/layout.lua +++ /dev/null @@ -1,174 +0,0 @@ ----@diagnostic disable: lowercase-global, undefined-global -local inner_gaps = 10 -local outer_gaps = 15 -local smart_gaps = true - -local outputs = {} - -function _get_output(name) - local output = outputs[name] - if output ~= nil then - return output - end - outputs[name] = { - mfact = 0.65, - mcount = 1, - layout = "tiling", - alayout = "monocle" - } - return outputs[name] -end - --- The most important function - the actual layout generator --- --- The argument is a table with: --- * Focused tags (`args.tags`) --- * Window count (`args.count`) --- * Output width (`args.width`) --- * Output height (`args.height`) --- * Output name (`args.output`) --- --- The return value must be a table with exactly `count` entries. Each entry is a table with four --- numbers: --- * X coordinate --- * Y coordinate --- * Window width --- * Window height --- --- This example is a simplified version of `rivertile` -function handle_layout(args) - local output = _get_output(args.output) - - -- Prevent mcount from growing too much. We can't do that in the set function. - output.mcount = math.min(output.mcount, args.count) - - local ret = {} - - if args.count == 1 or output.layout == "monocle" then - if smart_gaps then - for _ = 0, (args.count - 1) do - table.insert(ret, { 0, 0, args.width, args.height }) - end - else - for _ = 0, (args.count - 1) do - table.insert(ret, { outer_gaps, outer_gaps, args.width - outer_gaps * 2, args.height - outer_gaps * 2 }) - end - end - return ret - end - - local width = args.width - outer_gaps * 2 - local height = args.height - outer_gaps * 2 - local mcount = math.min(output.mcount, args.count) - local scount = math.max(args.count - mcount, 0) - - local old_scount = scount - if output.layout == "deck" and scount > 0 then - scount = 1; - end - - local main_w = (width * output.mfact) - (inner_gaps / 2) - local side_w = (width * (1 - output.mfact)) - (inner_gaps / 2) - local main_h = (height - (inner_gaps * (mcount - 1))) / mcount - local side_h = (height - (inner_gaps * (scount - 1))) / scount - - scount = old_scount - - if args.count <= output.mcount then - main_w = width - end - - for i = 0, (mcount - 1) do - table.insert(ret, { - outer_gaps, - outer_gaps + i * (main_h + inner_gaps), - main_w, - main_h, - }) - end - for i = 0, (scount - 1) do - local y = outer_gaps + i * (side_h + inner_gaps) - if output.layout == "deck" then - y = outer_gaps - end - - table.insert(ret, { - main_w + outer_gaps * 2, - y, - side_w, - side_h, - }) - end - return ret -end - --- This optional function returns the metadata for the current layout. --- Currently only `name` is supported, the name of the layout. It get's passed --- the same `args` as handle_layout() -function handle_metadata(args) - local output = _get_output(args.output) - - if output.layout == "tiling" then - return { name = "[]=" } - elseif output.layout == "monocle" then - return { name = string.format("[%d]", args.count) } - elseif output.layout == "deck" then - return { name = "[D]" } - else - return { name = "><>" } - end -end - --- IMPORTANT: User commands send via `riverctl send-layout-cmd` are treated as lua code. --- Active tags are stored in `CMD_TAGS` global variable. --- Output name is stored in `CMD_OUTPUT` global variable. - --- Here is an example of a function that can be mapped to some key --- Run with `riverctl send-layout-cmd luatile "toggle_gaps()"` -function set_mfact(diff) - local output = _get_output(CMD_OUTPUT) - output.mfact = math.max(0, math.min(output.mfact + diff, 1)) -end - -function set_mcount(diff) - local output = _get_output(CMD_OUTPUT) - -- we don't have the number of clients so we can't set a max value there. - output.mcount = math.max(0, output.mcount + diff) -end - -function set_layout(name) - local output = _get_output(CMD_OUTPUT) - if output.layout == name then - output.layout = output.alayout - output.alayout = name - else - output.alayout = output.layout - output.layout = name - end -end - --- Just an helper function to print tables. -function inspect(tbl) - local result = "{" - for k, v in pairs(tbl) do - -- Check the key type (ignore any numerical keys - assume its an array) - if type(k) == "string" then - result = result .. "[\"" .. k .. "\"]" .. "=" - end - - -- Check the value type - if type(v) == "table" then - result = result .. inspect(v) - elseif type(v) == "boolean" then - result = result .. tostring(v) - else - result = result .. "\"" .. v .. "\"" - end - result = result .. "," - end - -- Remove leading commas from the result - if result ~= "" then - result = result:sub(1, result:len() - 1) - end - return result .. "}" -end diff --git a/environments/server/default.nix b/environments/server/default.nix index 29e6ebc..d422e50 100644 --- a/environments/server/default.nix +++ b/environments/server/default.nix @@ -16,21 +16,6 @@ wrapProgram $out/bin/guesspath --prefix PATH : '${lib.makeBinPath propagatedBuildInputs}' "; }; - - smartrss = pkgs.stdenv.mkDerivation rec { - name = "smartrss"; - nativeBuildInputs = with pkgs; [makeWrapper]; - propagatedBuildInputs = with pkgs; [ - python3Packages.guessit - curl - jq - ]; - dontUnpack = true; - installPhase = " - install -Dm755 ${./smartrss.sh} $out/bin/smartrss - wrapProgram $out/bin/smartrss --prefix PATH : '${lib.makeBinPath propagatedBuildInputs}' - "; - }; in { imports = [ ./otel.nix @@ -156,42 +141,6 @@ in { defaults.email = "zoe.roux@zoriya.dev"; }; - services.transmission = { - enable = true; - package = pkgs.transmission_4; - # Make downloaded items readable/writable by users - group = "users"; - settings = { - umask = "002"; - incomplete-dir-enabled = false; - download-dir = "/mnt/kyoo/downloads"; - download-queue-enabled = false; - rename-partial-files = false; - trash-can-enabled = false; - script-torrent-added-enabled = true; - script-torrent-added-filename = "${guesspath}/bin/guesspath"; - }; - }; - # Also allows transmission to reach theses files - systemd.services.transmission.serviceConfig.BindPaths = [ - "/mnt/kyoo/downloads" - "/mnt/kyoo/shows" - "/mnt/kyoo/lives" - "/mnt/kyoo/manga" - ]; - systemd.services.flood = { - enable = true; - wantedBy = ["multi-user.target"]; - after = ["transmission.service"]; - requires = ["transmission.service"]; - path = with pkgs; [mediainfo smartrss]; - serviceConfig = { - ExecStart = "${pkgs.flood}/bin/flood --rundir=/var/lib/flood --trurl=http://127.0.0.1:9091/transmission/rpc --truser '' --trpass ''"; - User = "transmission"; - Restart = "on-failure"; - }; - }; - services.gitea = { enable = true; settings.server = rec { diff --git a/environments/server/smartrss.sh b/environments/server/smartrss.sh deleted file mode 100755 index 180000c..0000000 --- a/environments/server/smartrss.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -set -e - -name=$(guessit "$1" -P title | tr -d "[:punct:]") - -ls /mnt/kyoo/shows/ | tr -d "[:punct:]" | grep -qix "$name" - -echo "Downloading $1" -exit 80 diff --git a/flake.lock b/flake.lock index 33af330..b30f67e 100644 --- a/flake.lock +++ b/flake.lock @@ -56,11 +56,11 @@ ] }, "locked": { - "lastModified": 1753121425, - "narHash": "sha256-TVcTNvOeWWk1DXljFxVRp+E0tzG1LhrVjOGGoMHuXio=", + "lastModified": 1754091436, + "narHash": "sha256-XKqDMN1/Qj1DKivQvscI4vmHfDfvYR2pfuFOJiCeewM=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "644e0fc48951a860279da645ba77fe4a6e814c5e", + "rev": "67df8c627c2c39c41dbec76a1f201929929ab0bd", "type": "github" }, "original": { @@ -90,22 +90,6 @@ "type": "indirect" } }, - "flood": { - "flake": false, - "locked": { - "lastModified": 1738516486, - "narHash": "sha256-B1hAmv1sRxqHM9EBO7Wij54Q8xK8Cpasb7DDSovI3qM=", - "owner": "zoriya", - "repo": "flood", - "rev": "875ae36d17300c630c2370f132eb385a048fc1e1", - "type": "github" - }, - "original": { - "owner": "zoriya", - "repo": "flood", - "type": "github" - } - }, "git-hooks": { "inputs": { "flake-compat": "flake-compat_2", @@ -180,11 +164,11 @@ ] }, "locked": { - "lastModified": 1754085240, - "narHash": "sha256-kVHCrTWEe8B1thAhFag1bk4QPY0ZP45V9vPbrwPHoNo=", + "lastModified": 1754225444, + "narHash": "sha256-mv01SQtqlhBMavc1dgNjgqJw4WfZxy+w3xBgwJU3YmU=", "owner": "nix-community", "repo": "home-manager", - "rev": "e102920c1becb114645c6f92fe14edc0b05cc229", + "rev": "0de18bd5c6681280d7ae017fa34ffd91bdcf0557", "type": "github" }, "original": { @@ -221,11 +205,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1754050710, - "narHash": "sha256-zGGx7XFSJd1mRIrUrDbjKGXDjfk/aPRToDbLrshLbUU=", + "lastModified": 1754255242, + "narHash": "sha256-upKFxktmKdohNMtOAUDgvqQWoeJknPuToO+mIlsEgX4=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "84d2911ae6b97e160ed8de8ece7bd1068c2bf686", + "rev": "0c756117aa0efb7c44ac98b4761334236549148b", "type": "github" }, "original": { @@ -237,11 +221,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1753992225, - "narHash": "sha256-QUlWhBgDm9No+RkI33faSqsSZNU/QhZjMOP333FjN38=", + "lastModified": 1754177742, + "narHash": "sha256-XdTNh9hDRxahnvIB9m2t/8RovK0qV1NsJ0bw86/nZVM=", "owner": "neovim", "repo": "neovim", - "rev": "c3a4d125296caaf15ff424e7609e731a8b4d37e7", + "rev": "93f5bd0caf9037f95ee77288bfd424008bc3a14b", "type": "github" }, "original": { @@ -277,11 +261,11 @@ ] }, "locked": { - "lastModified": 1753589988, - "narHash": "sha256-y1JlcMB2dKFkrr6g+Ucmj8L//IY09BtSKTH/A7OU7mU=", + "lastModified": 1754195341, + "narHash": "sha256-YL71IEf2OugH3gmAsxQox6BJI0KOcHKtW2QqT/+s2SA=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "f0736b09c43028fd726fb70c3eb3d1f0795454cf", + "rev": "b7fcd4e26d67fca48e77de9b0d0f954b18ae9562", "type": "github" }, "original": { @@ -307,11 +291,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1753122741, - "narHash": "sha256-nFxE8lk9JvGelxClCmwuJYftbHqwnc01dRN4DVLUroM=", + "lastModified": 1754229794, + "narHash": "sha256-yOl7REX6O/1mh+tpscJPKgjK6nmXSMOB1xhmDNAMUZM=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "cc66fddc6cb04ab479a1bb062f4d4da27c936a22", + "rev": "a872d985392ee5b19d8409bfcc3f106de2070070", "type": "github" }, "original": { @@ -329,11 +313,11 @@ ] }, "locked": { - "lastModified": 1753704990, - "narHash": "sha256-5E14xuNWy2Un1nFR55k68hgbnD8U2x/rE5DXJtYKusw=", + "lastModified": 1754260137, + "narHash": "sha256-IViMH6Fwj8nwO1nuYCqOTpjm9OK9rQ0w8nmoOwPlo98=", "owner": "nix-community", "repo": "NixOS-WSL", - "rev": "58c814cc6d4a789191f9c12e18277107144b0c91", + "rev": "57ba096649fa4e12dc564e8e3c529255baf89b35", "type": "github" }, "original": { @@ -357,26 +341,8 @@ "type": "indirect" } }, - "river-src": { - "flake": false, - "locked": { - "lastModified": 1742891484, - "narHash": "sha256-7ZSKYw0ZbYUWBp2Djw2W2Gg15W2TQzBLYpoarqpJFN8=", - "owner": "zoriya", - "repo": "river", - "rev": "a40883358d4a00e96e43ef95bd115172749b81a9", - "type": "github" - }, - "original": { - "owner": "zoriya", - "ref": "0.3.x", - "repo": "river", - "type": "github" - } - }, "root": { "inputs": { - "flood": "flood", "home-manager": "home-manager", "impermanence": "impermanence", "neovim-nightly": "neovim-nightly", @@ -386,7 +352,6 @@ "nixos-hardware": "nixos-hardware", "nixos-wsl": "nixos-wsl", "nixpkgs": "nixpkgs", - "river-src": "river-src", "tmux": "tmux", "zen-browser": "zen-browser" } @@ -415,11 +380,11 @@ ] }, "locked": { - "lastModified": 1753772294, - "narHash": "sha256-8rkd13WfClfZUBIYpX5dvG3O9V9w3K9FPQ9rY14VtBE=", + "lastModified": 1754061284, + "narHash": "sha256-ONcNxdSiPyJ9qavMPJYAXDNBzYobHRxw0WbT38lKbwU=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "6b9214fffbcf3f1e608efa15044431651635ca83", + "rev": "58bd4da459f0a39e506847109a2a5cfceb837796", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 06f908b..40e2748 100644 --- a/flake.nix +++ b/flake.nix @@ -24,14 +24,6 @@ url = "github:nix-community/neovim-nightly-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; - flood = { - url = "github:zoriya/flood"; - flake = false; - }; - river-src = { - url = "github:zoriya/river/0.3.x"; - flake = false; - }; zen-browser = { url = "github:youwen5/zen-browser-flake"; inputs.nixpkgs.follows = "nixpkgs"; diff --git a/overlays/default.nix b/overlays/default.nix index c28374c..a80b6e8 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -1,9 +1,4 @@ -{ - flood, - river-src, - tmux, - ... -}: self: super: let +{tmux, ...}: self: super: let wrapProgram = drv: bins: wrapProgramFlags: super.symlinkJoin { name = drv.name; @@ -21,22 +16,6 @@ --add-flags "--ozone-platform=wayland" \ --add-flags "--disable-smooth-scrolling"''; in { - # Use my fork of flood to enable smart scripts. - flood = super.flood.overrideAttrs rec { - src = flood; - npmDeps = pnpmDeps; - pnpmDeps = super.pnpm_9.fetchDeps { - pname = "flood"; - version = "4.9.4-dirty"; - src = flood; - hash = "sha256-E2VxRcOMLvvCQb9gCAGcBTsly571zh/HWM6Q1Zd2eVw="; - }; - }; - - river = super.river.overrideAttrs { - src = river-src; - }; - tmux = super.tmux.overrideAttrs { src = tmux; };