commit 70c515d9a78584a08ea9de4ec6d127009fb79ce0
parent 9fbb26274325009246de0921db7e16509edbe4d5
Author: William Casarin <jb55@jb55.com>
Date:   Fri, 17 Nov 2023 06:21:37 -0800
Merge remote-tracking branch 'origin/master'
Diffstat:
21 files changed, 219 insertions(+), 83 deletions(-)
diff --git a/bin/btc-balance b/bin/btc-balance
@@ -1,8 +1,14 @@
 #!/usr/bin/env bash
 #btc coins | awk '{print $3}' | xargs printf '%.8f * 100000000\n' | bc -l | xargs printf '%.0f\n' | paste -sd+ | bc -l | xargs printf '%s sats to btc\n' | bcalc -n
 
-bcli -rpcwallet=personal getbalance
-bcli -rpcwallet=vanessa getbalance
+for wallet in personal vanessa multisig bare clightning
+do
+	echo -n "$wallet "
+	bcli -rpcwallet="$wallet" getbalance
+done
+
+echo -n "cln-availout "
+lcli summary | grep avail_out | cut -d= -f2 | cut -d" " -f1 | xargs printf '%s to btc\n' | bcalc -n
 
 #if [ -n "$1" ]; then
 #  FIAT=$(printf '%s sats to fiat\n' "$SATS" | bcalc --price "$1")
diff --git a/bin/fuzz-notmuch-am b/bin/fuzz-notmuch-am
@@ -1,4 +1,4 @@
 #!/usr/bin/env bash
 set -eou pipefail
 
-echo notmuch am query:patches
+echo notmuch am -s --am -f ${1:-query:patches}
diff --git a/bin/fuzz-reader b/bin/fuzz-reader
@@ -13,7 +13,7 @@ document=$(find "$BOOKS_DIR" \( -iname '*.txt' -o -iname '*.epub' -o -iname '*.p
 name="$(basename "$document")"
 noext="${name%.*}"
 
-wname "$noext"
+#wname "$noext"
 ext="$(extname "$document")"
 if [ "$ext" == ".txt" ] || [ "$ext" == ".md" ] || [ "$ext" == ".mediawiki" ]; then
 	echo lessr "$document"
diff --git a/bin/mail-prlink b/bin/mail-prlink
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+tac |
+grep -E '^https://github\.com.*pull/' |
+head -n1 |
+sed -En 's,^(.*github.com/[^/]+/[^/]+/pull/[0-9]+).*,\1,p'
diff --git a/bin/mail-prpatch b/bin/mail-prpatch
@@ -2,11 +2,6 @@
 
 set -eou pipefail
 
-args=$(
-tac |
-grep -E 'github\.com.*pull/' |
-head -n1 |
-sed -En 's,.*github.com/([^/]+)/([^/]+)/pull/([0-9]+).*,\3 \1/\2,p'
-)
+args=$(mail-prlink | sed -En 's,.*github.com/([^/]+)/([^/]+)/pull/([0-9]+).*,\3 \1/\2,p')
 
 prpatch $args
diff --git a/bin/mail-prpatch-insert b/bin/mail-prpatch-insert
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+
+set -e
+
+function new_msgid() {
+	echo "<$(sha256sum "$1" | awk '{ print $1 }')-$(date +%s)>"
+}
+
+TO="jb55@jb55.com"
+PRPATCH="$HOME/var/prpatch"
+MBOX="$PRPATCH/out.mbox"
+PATCHES="$PRPATCH/out"
+
+function build_coverletter() {
+	<"$1" awk '/^$/ {exit} {print}' > "$PRPATCH"/header
+	<"$PRPATCH/mail" awk 'BEGIN {print_it=0;} skip > 0 {skip -= 1; next;} /^----==_mimepart/ {print_it=!print_it;skip=3;next;} print_it==1 {print;}' |
+		cat "$PRPATCH/header" - |
+		sed -E 's,(PATCH[^1]+)1,\10,' > "$PATCHES/0000"
+}
+
+rm -rf "$PRPATCH"
+mkdir -p "$PATCHES"
+mail="$(cat -)"
+prlink="$(mail-prlink <<<"$mail")"
+#threadid=$(<<<"$mail" grep -i '^message-id:' | cut -d: -f2-)
+pr="$(<<<"$prlink" sed -En 's,.*github.com/([^/]+)/([^/]+)/pull/([0-9]+).*,\3,p')"
+target="$(<<<"$prlink" sed -En 's,.*github.com/([^/]+)/([^/]+)/pull/([0-9]+).*,\2,p')"
+replyto="$(grep -i '^reply-to:' <<<"$mail" | cut -d":" -f2- | tr -d '\n' || :)"
+echo "$mail" > "$PRPATCH/mail"
+<<<"$mail" mail-prpatch > "$MBOX"
+
+# pull out the cover letter
+
+git mailsplit -o"$PATCHES" "$MBOX"
+
+$(build_coverletter "$PATCHES/0001")
+
+file="$PATCHES"/0000
+msgid=$(new_msgid "$file")
+threadid=$msgid
+for file in "$PATCHES/"*
+do
+	# mailsplit introduces linebreaks from some reason
+	awk '
+	  /^Subject:/ { subj = 1; printf "%s", $0; next }
+	  subj && !/^$/ { printf " %s", $0; next }
+	  /^$/ && subj { subj = 0; print ""; next }
+	  { print }
+	' < "$file" > "$file".2
+	mv "$file".2 "$file"
+
+	if [ -n "$replyto" ]; then
+		sed -i"" "1 a Cc: $replyto" "$file" 
+	fi
+
+	if [ -n "$prlink" ]; then
+		sed -i"" "0,/^---/{s@^---@\nCloses: $prlink\n---@}" "$file" 
+	fi
+
+	if [ -n "$target" ]; then
+		sed -i"" "s,\[PATCH,\[PATCH $target," "$file"
+	fi
+
+	if [[ "$prlink" =~ "damus-io" ]]; then
+		TO="patches@damus.io"
+	fi
+
+	sed -i"" "1 a To: $TO" "$file" 
+	sed -i"" "1 a Message-ID: $msgid" "$file" 
+
+	# build thread
+	sed -i"" "1 a In-Reply-To: $threadid" "$file" 
+	sed -i"" "1 a References: $threadid" "$file" 
+
+	notmuch insert +inbox < "$file"
+
+	msgid=$(new_msgid "$file")
+done
diff --git a/bin/mutt-local-date b/bin/mutt-local-date
@@ -0,0 +1,14 @@
+#!/usr/bin/perl -n
+
+use Date::Parse;
+use POSIX;
+use strict;
+
+if (/^Date: (.*)$/) {
+    my $datestr = $1;
+    my $date = strftime ("%a, %d %b %Y %H:%M:%S",
+                         localtime (str2time ($datestr)));
+    print "Local-Date: $date\n";
+}
+
+print;
diff --git a/bin/nix-build-cache b/bin/nix-build-cache
@@ -5,6 +5,8 @@ printf "building cache of haskellPackages\n" >&2
 nix-env -f $NIXPKGS -qaPA haskellPackages > /tmp/search2 &
 printf "building cache of perlPackages\n" >&2
 nix-env -f $NIXPKGS -qaPA perlPackages > /tmp/search3 &
+printf "building cache of linuxPackages\n" >&2
+nix-env -f $NIXPKGS -qaPA linuxPackages > /tmp/search4 &
 wait
-cat /tmp/search{1,2,3} | sort > ~/.nixenv.cache
-rm -f /tmp/search1 /tmp/search2
+cat /tmp/search{1,2,3,4} | sort > ~/.nixenv.cache
+rm -f /tmp/search{1,2,3,4}
diff --git a/dotfiles/.bashrc b/dotfiles/.bashrc
@@ -16,8 +16,13 @@ export NIX_PATH="dotfiles=$HOME/dotfiles:$NIX_PATH"
 #[ -z "$PS1" ] && return
 
 export HOST=$(hostname)
+export IGNORE_WINDOW_CHECK=1
 export LONG_RUNNING_COMMAND_TIMEOUT=3
-export PS1='$(printf "\x01\033[30;1m\x02%3.*s\x01\033[0m\x02 %s> \x01\033[33m\x02" $? $? $HOST)'
+IN_NIX=""
+if [ -n "$IN_NIX_SHELL" ]; then
+	IN_NIX="-nix"
+fi
+export PS1='$(printf "\x01\033[30;1m\x02%3.*s\x01\033[0m\x02 %s%s> \x01\033[33m\x02" $? $? $HOST $IN_NIX)'
 export PS0='\033[0m'
 
 #export PS1='$(printf "\x01\033[30;1m\x02%3.*s\x01\033[0m\x02> " $? $?)'
diff --git a/dotfiles/.config/neomutt/neomuttrc b/dotfiles/.config/neomutt/neomuttrc
@@ -8,6 +8,7 @@ set wait_key=no
 set pager_stop=yes
 set from="jb55@jb55.com"
 set pipe_decode=yes
+set sig_dashes=no
 set pipe_split=no
 set envelope_from=yes
 set mime_forward=yes
@@ -28,14 +29,13 @@ set sort = reverse-last-date-received
 
 virtual-mailboxes \
   "INBOX" "notmuch://?query=query:inbox" \
-  "damus-prs" "notmuch://?query=query:damusp" \
-  "damus-issues" "notmuch://?query=query:damusi" \
-  "damus-all-issues" "notmuch://?query=query:damus-all-issues" \
-  "damus-all-issues-no-elsat" "notmuch://?query=query:damus-all-issues-no-elsat" \
   "patches" "notmuch://?query=query:patches" \
-  "damus-issues-no-elsat" "notmuch://?query=query:damusinoelsat"
+  "today" "notmuch://?query=date:today" \
+  "damus-prs" "notmuch://?query=query:damusp" \
+  "damus-issues" "notmuch://?query=query:damusi"
 
 macro index,pager a "<modify-labels>-unread -inbox<enter>
+macro index,pager i "<modify-labels>+inbox<enter>
 macro index,pager A "<create-alias>" "Create alias"
 macro index,pager F "<modify-labels>+filed" "File message"
 macro index,pager + "<modify-labels>+"
@@ -49,7 +49,8 @@ macro pager u "<previous-page>"
 macro pager t "|collapse|less<enter>"
 macro attach h "|w3m -dump -T text/html | less<enter>" "View text/html with w3m"
 #macro pager P "|grep patch$ | xargs curl -sL | delta --paging always<enter>"
-macro pager P "| mail-prpatch | delta --paging always"
+macro pager P ":set pipe_decode=no<enter> | mail-prpatch | delta --paging always"
+macro pager G ":set pipe_decode=no<enter> | mail-prpatch-insert"
 
 my_hdr Bcc: William Casarin <jb55@jb55.com>
 
@@ -70,5 +71,6 @@ color header            brightcyan          default        '^Subject:'
 folder-hook . "push \eV"
 set collapse_unread=yes
 set uncollapse_jump=yes
+set display_filter=~/bin/mutt-local-date
 
 source ~/.mail_aliases
diff --git a/dotfiles/.config/qutebrowser/config.py b/dotfiles/.config/qutebrowser/config.py
@@ -75,6 +75,13 @@ config.bind('e', 'open-editor')
 config.bind('co', 'tab-only')
 config.bind('gl', 'tab-move +')
 config.bind('gh', 'tab-move -')
+
+# Remove fixed, sticky elements from pages.
+# This is useful to recover full page scrolling
+#config.bind(',s', 'jseval javascript:(function(){x=document.querySelectorAll(`*`);for(i=0;i<x.length;i++){elementStyle=getComputedStyle(x[i]);if(elementStyle.position.startsWith("fixed")||elementStyle.position.startsWith("sticky")){x[i].style.position=`absolute`;}}}())')
+
+config.bind(',s', "jseval javascript:(function(){var elements=document.querySelectorAll(`*`);Array.from(elements).forEach(function(element){var style=getComputedStyle(element);if(style.position.startsWith(`fixed`)||style.position.startsWith(`sticky`)){element.style.cssText+=`position: absolute !important;`;}});})()")
+
 config.bind('gF', 'hint all tab-bg')
 config.unbind('D')
 config.bind('Do', 'download-open')
diff --git a/dotfiles/.gitconfig b/dotfiles/.gitconfig
@@ -111,3 +111,8 @@
 	defaultBranch = master
 [nostr]
 	relays = wss://relay.damus.io wss://nos.lol wss://nostr.wine
+[filter "lfs"]
+	clean = git-lfs clean -- %f
+	smudge = git-lfs smudge -- %f
+	process = git-lfs filter-process
+	required = true
diff --git a/dotfiles/.notmuch-config b/dotfiles/.notmuch-config
@@ -113,11 +113,6 @@ inbox=tag:inbox and not tag:filed
 lightning=tag:inbox and tag:lightning
 list=tag:list and not tag:github and tag:inbox and not tag:busy
 notmuch=tag:notmuch and tag:inbox
-today=date:today and tag:inbox
-work=tag:inbox and tag:work
-patches=subject:PATCH and tag:inbox and (to:jb55@jb55.com or to:patches@damus.io)
+patches=subject:PATCH and tag:inbox
 damusp=(subject:PR or subject:PATCH) and subject:damus and tag:inbox
 damusi=subject:Issue and subject:damus-io and tag:inbox
-damus-all-issues=subject:Issue and subject:damus-io
-damus-all-issues-no-elsat=subject:Issue and subject:damus-io and not from:alltheseas
-damusinoelsat=subject:Issue and subject:damus-io and tag:inbox and not from:alltheseas
diff --git a/dotfiles/.screenrc b/dotfiles/.screenrc
@@ -15,3 +15,4 @@ hardstatus string '%{= 9b}[ %{B}%H %{b}][%= %{= 9w}%?%-Lw%?%{=b 9R}(%{W}%n*%f %t
 
 maptimeout 0
 
+truecolor on
diff --git a/dotfiles/.tmux.conf b/dotfiles/.tmux.conf
@@ -19,9 +19,9 @@ bind C-X swap-pane
 setw -g mode-keys vi
 
 # Make mouse useful in copy mode
-setw -g mode-mouse on
+#setw -g mode-mouse on
 setw -g escape-time 0
-setw -g mouse-resize-pane on
+#setw -g mouse-resize-pane on
 
 # More straight forward key bindings for splitting
 unbind %
@@ -57,8 +57,8 @@ setw -g window-status-current-format '#I:#W#F'
 setw -g automatic-rename off
 
 # Status Bar
-set -g status-bg colour233
-set -g status-fg colour239
+set -g status-bg colour0
+set -g status-fg colour2
 #set -g status-interval 1
 #set -g status-left '#[fg=colour118]#H#[default]'
 #set -g status-right '#[fg=colour238]#(cut -d " " -f 1-4 /proc/loadavg)#[default] #[fg=colour242]%Y-%m-%d %H:%M:%S#[default]'
@@ -71,14 +71,14 @@ set -g visual-activity off
 set -g visual-bell off
 
 # Highlighting the active window in status bar
-setw -g window-status-current-bg colour233
-setw -g window-status-current-fg colour154
+#setw -g window-status-current-bg colour233
+#setw -g window-status-current-fg colour154
 
-set -g pane-border-bg black
-set -g pane-border-fg colour238
+#set -g pane-border-bg black
+#set -g pane-border-fg colour238
 
-set -g pane-active-border-bg black
-set -g pane-active-border-fg colour112
+#set -g pane-active-border-bg black
+#set -g pane-active-border-fg colour112
 
 # Clock
 setw -g clock-mode-colour green
@@ -87,12 +87,11 @@ setw -g clock-mode-style 24
 # Title
 
 # powerline
-set-option -g status on
-set-option -g status-interval 2
-set-option -g status-utf8 on
-set-option -g status-justify "centre"
-set-option -g status-left-length 60
-set-option -g status-right-length 90
-set-option -g status-left "#(~/dev/tmux-powerline/status-left.sh)"
-set-option -g status-right "#(~/dev/tmux-powerline/status-right.sh)"
-
+#set-option -g status on
+#set-option -g status-interval 2
+#set-option -g status-utf8 on
+#set-option -g status-justify "centre"
+#set-option -g status-left-length 60
+#set-option -g status-right-length 90
+#set-option -g status-left "#(~/dev/tmux-powerline/status-left.sh)"
+#set-option -g status-right "#(~/dev/tmux-powerline/status-right.sh)"
diff --git a/dotfiles/commands b/dotfiles/commands
@@ -37,6 +37,7 @@ eG	edit gemmarks	echo edit ~/dotfiles/gemmarks
 elf	edit last files	fuzz-last-files edit
 eM	edit mimi	echo edit ~/.config/mimi/mime.conf
 em	edit mutt config	echo edit ~/.config/neomutt/neomuttrc
+ea	edit mail aliases	echo edit ~/.mail_aliases
 et	edit todo	echo edit ~/docs/todo/todo.txt
 ff	create file	echo fuzz-create-file
 gb	git branches	echo git bvr
@@ -57,9 +58,6 @@ m	mutt	echo neomutt
 mP	mutt prs	echo neomutt -f damus-prs
 mp	mutt patches	echo neomutt -f patches
 mi	mutt issues	echo neomutt -f damus-issues
-min	mutt issues noelsat	echo neomutt -f damus-issues-no-elsat
-mai	mutt all issues	echo neomutt -f damus-all-issues
-main	mutt all issues noelsat	echo neomutt -f damus-all-issues-no-elsat
 Nc	new command	echo make-script
 ni	notmuch inbox	fuzz-notmuch-inbox
 nT	email today	echo f nt query:today
@@ -68,6 +66,7 @@ of	open file	fuzz-open-file
 olf	open last files	fuzz-last-files open
 pr	cd project root	echo cd \"$(project-root)\"
 pc	cat project file	fuzz-cat-file
+pr	cd project root	echo cd $(project-root)
 pf	edit project file	fuzz-edit-file
 ps	edit project skeletons	fuzz-edit-file --dir ~/dotfiles/skeletons
 rf	recent files	fuzz-recent-files
diff --git a/nix-config/environment/default.nix b/nix-config/environment/default.nix
@@ -70,7 +70,7 @@ let jb55pkgs = import <jb55pkgs> { inherit pkgs; };
       linuxPackages.bpftrace
       linuxPackages.perf
       lsof
-      mailutils
+      #mailutils
       man-pages
       mdcat
       minisign
diff --git a/nix-config/environment/desktop/default.nix b/nix-config/environment/desktop/default.nix
@@ -118,7 +118,7 @@ in {
     VK_ICD_FILENAMES = "/run/opengl-driver/share/vulkan/icd.d/radeon_icd.x86_64.json"; # radv
   };
 
-  programs.steam.enable = false;
+  programs.steam.enable = true;
 
   environment.systemPackages = if extra.is-minimal then (with pkgs; [
     #steam
diff --git a/nix-config/machines/monad/bitcoin/default.nix b/nix-config/machines/monad/bitcoin/default.nix
@@ -9,11 +9,11 @@ let
   nix-bitcoin = import (pkgs.fetchFromGitHub {
     owner  = "fort-nix";
     repo   = "nix-bitcoin";
-    rev    = "v0.0.44";
-    sha256 = "08qn597r3xnqg9s7bnkssf4xcxvm0lf6xmisr86nkp2gammazc42";
+    rev    = "v0.0.89";
+    sha256 = "sha256-SMJW+QZt3iRuoezjE12sopBsdLHDihXe/RerLfRpqoI=";
   }) { inherit pkgs; };
 
-  plugins = ["summary" "rebalance"];
+  plugins = ["summary"];
 
   mkPluginCfg = name:
     "plugin=${builtins.getAttr name (nix-bitcoin.clightning-plugins)}/${name}.py";
@@ -91,25 +91,25 @@ in
     };
   };
 
-  services.clightning.networks = {
-    mainnet = {
-      dataDir = "/home/jb55/.lightning-bitcoin";
-
-      config = ''
-        bitcoin-rpcuser=rpcuser
-        bitcoin-rpcpassword=rpcpass
-        bitcoin-rpcconnect=127.0.0.1
-        bitcoin-rpcport=8332
-        fee-per-satoshi=900
-        bind-addr=0.0.0.0:9735
-        announce-addr=24.84.152.187:9735
-        network=bitcoin
-        alias=jb55.com
-        rgb=ff0000
-        proxy=127.0.0.1:9050
-        experimental-offers
-        ${lib.concatStringsSep "\n" (map mkPluginCfg plugins)}
-      '';
-    };
-  };
+  #services.clightning.networks = {
+  #  mainnet = {
+  #    dataDir = "/home/jb55/.lightning-bitcoin";
+
+  #    config = ''
+  #      bitcoin-rpcuser=rpcuser
+  #      bitcoin-rpcpassword=rpcpass
+  #      bitcoin-rpcconnect=127.0.0.1
+  #      bitcoin-rpcport=8332
+  #      fee-per-satoshi=900
+  #      bind-addr=0.0.0.0:9735
+  #      announce-addr=24.84.152.187:9735
+  #      network=bitcoin
+  #      alias=jb55.com
+  #      rgb=ff0000
+  #      proxy=127.0.0.1:9050
+  #      experimental-offers
+  #      ${lib.concatStringsSep "\n" (map mkPluginCfg plugins)}
+  #    '';
+  #  };
+  #};
 }
diff --git a/nix-config/machines/monad/default.nix b/nix-config/machines/monad/default.nix
@@ -107,14 +107,9 @@ in
   services.dnsmasq.resolveLocalQueries = true;
   #services.dnsmasq.servers = ["127.0.0.1#43"];
   # services.dnsmasq.servers = ["127.0.0.1#43" "1.1.1.1" "8.8.8.8"];
-  services.dnsmasq.servers = ["8.8.8.8" "8.8.4.4" ];
-  services.dnsmasq.extraConfig = ''
-    cache-size=10000
-    addn-hosts=/var/hosts
-    conf-file=/var/dnsmasq-hosts
-    conf-file=/var/distracting-hosts
-  '';
-
+  services.dnsmasq.settings.server = ["8.8.8.8" "8.8.4.4" ];
+  services.dnsmasq.settings.conf-file = "/var/dnsmasq-hosts";
+  services.dnsmasq.settings.addn-hosts = "/var/hosts";
 
   services.bitlbee.plugins = with pkgs; [
     bitlbee-mastodon
@@ -141,7 +136,7 @@ in
   };
 
   systemd.user.services.bitcoin-contacts = {
-    enable = if extra.is-minimal then false else true;
+    enable = false;
     description = "Email bitcoin PR patches that have me as a git-contact";
 
     wantedBy    = [ "graphical-session.target" ];
@@ -322,6 +317,20 @@ in
   systemd.services.nginx.serviceConfig.ReadWritePaths = [ "/var/www" ];
   services.nginx.httpConfig = ''
       server {
+        listen 80 default_server;
+        listen ${extra.machine.ztip}:80 default_server;
+        listen 192.168.87.26 default_server;
+
+        server_name monad.jb55.com;
+
+        location / {
+          root                  /var/www/public;
+          autoindex on;
+          index index.html;
+        }
+      }
+
+      server {
         listen 80;
         listen ${extra.machine.ztip}:80;
         listen 192.168.87.26;
@@ -377,7 +386,7 @@ in
     serviceConfig.Type = "oneshot";
     serviceConfig.ExecStart = util.writeBash "disable-c6-state" ''
       ${pkgs.kmod}/bin/modprobe msr
-      ${pkgs.python2}/bin/python ${zenstates}/zenstates.py --c6-disable --list
+      ${pkgs.python3}/bin/python ${zenstates}/zenstates.py --c6-disable --list
     '';
   };
 
diff --git a/nix-config/machines/monad/networking/default.nix b/nix-config/machines/monad/networking/default.nix
@@ -46,6 +46,8 @@ let
     "nixos-fw -s 10.100.0.0/24,192.168.87.1/24 -p tcp --dport 5442 -j nixos-fw-accept"
     "nixos-fw -s 10.100.0.0/24 -p tcp --dport 80 -j nixos-fw-accept"
     "nixos-fw -s 10.100.0.0/24 -p tcp --dport 3000 -j nixos-fw-accept"
+    "nixos-fw -s 10.100.0.0/24 -p tcp --dport 25565 -j nixos-fw-accept"
+    "nixos-fw -s 10.100.0.0/24 -p tcp --dport 25575 -j nixos-fw-accept"
     "nixos-fw -s 10.100.0.2/32 -p tcp --dport ${toString ports.lntun} -j nixos-fw-accept"
     "nixos-fw -s 10.100.0.0/24 -p tcp --dport ${toString ports.weechat} -j nixos-fw-accept"
     "nixos-fw -s 10.100.0.0/24,192.168.87.1/24 -p tcp --dport 8333 -j nixos-fw-accept" # bitcoin
@@ -118,6 +120,12 @@ in
         { publicKey = "oYTNuXPl5GQsz53cL55MO9MfI61DyZBrBDy9ZFBpDWU="; # cross (air)
           allowedIPs = [ "10.100.0.8/32" ];
         } 
+        { publicKey = "kBTRfnUGBwbTlyazK1J67VVpzNg/wLjgmSfI9+1J6S4="; # ipad-air
+          allowedIPs = [ "10.100.0.12/32" ];
+        } 
+        { publicKey = "fj35gCObJ+uP/8tDpYsAD+b2XuSpa82umL/8LscIHwQ="; # pixel6-android
+          allowedIPs = [ "10.100.0.9/32" ];
+        }
       ];
     };
 
@@ -187,6 +195,10 @@ in
       # any requests that come in that match any these names will use the proxy.
       server_name plex.jb55.com plez.jb55.com media.home plex.home;
 
+      location = / {
+          return 302 http://plex.jb55.com/web/index.html;
+      }
+
       # this is where everything cool happens (you probably don't need to change anything here):
       location / {
         # if a request to / comes in, 301 redirect to the main plex page.
@@ -273,6 +285,7 @@ in
     }
   '';
 
+  systemd.services.transmission.enable = false;
   systemd.services.transmission.requires = [ "openvpn-pia.service" ];
   systemd.services.transmission.after    = [ "openvpn-pia.service" ];
   systemd.services.transmission.serviceConfig.User = lib.mkForce "root";