Procházet zdrojové kódy

Update scripts and move dotfiles

Bryan Roessler před 2 týdny
rodič
revize
dfb1c230cc

+ 0 - 1
dotfiles/.gitignore

@@ -1 +0,0 @@
-secrets/

+ 0 - 245
dotfiles/btrbk/.config/btrbk/btrbk.conf

@@ -1,245 +0,0 @@
-#
-# Example btrbk configuration file
-#
-#
-# Please refer to the btrbk.conf(5) man-page for a complete
-# description of all configuration options.
-# For more examples, see README.md included with this package.
-#
-#   btrbk.conf(5): <https://digint.ch/btrbk/doc/btrbk.conf.5.html>
-#   README.md:     <https://digint.ch/btrbk/doc/readme.html>
-#
-# Note that the options can be overridden per volume/subvolume/target
-# in the corresponding sections.
-#
-
-
-# Enable transaction log
-transaction_log            /var/log/btrbk.log
-
-# Specify SSH private key for remote connections
-ssh_identity               /home/bryan/.config/btrbk/id_ed25519
-ssh_user                   root
-
-# Use sudo if btrbk or lsbtr is run by regular user
-backend_local_user         btrfs-progs-sudo
-
-# Enable stream buffer. Adding a buffer between the sending and
-# receiving side is generally a good idea.
-# NOTE: If enabled, make sure to install the "mbuffer" package!
-stream_buffer              1g
-
-# Directory in which the btrfs snapshots are created. Relative to
-# <volume-directory> of the volume section.
-# If not set, the snapshots are created in <volume-directory>.
-#
-# If you want to set a custom name for the snapshot (and backups),
-# use the "snapshot_name" option within the subvolume section.
-#
-# NOTE: btrbk does not automatically create this directory, and the
-# snapshot creation will fail if it is not present.
-#
-snapshot_dir               .snapshots
-
-# Always create snapshots. Set this to "ondemand" to only create
-# snapshots if the target volume is reachable. Set this to "no" if
-# snapshot creation is done by another instance of btrbk.
-snapshot_create            onchange
-
-# Perform incremental backups (set to "strict" if you want to prevent
-# creation of non-incremental backups if no parent is found).
-#incremental                yes
-
-# Specify after what time (in full hours after midnight) backups/
-# snapshots are considered as a daily backup/snapshot
-#preserve_hour_of_day       0
-
-# Specify on which day of week weekly/monthly backups are to be
-# preserved.
-#preserve_day_of_week       sunday
-
-# Preserve all snapshots for a minimum period of time.
-#snapshot_preserve_min      1d
-
-# Retention policy for the source snapshots.
-#snapshot_preserve          <NN>h <NN>d <NN>w <NN>m <NN>y
-
-# Preserve all backup targets for a minimum period of time.
-#target_preserve_min        no
-
-# Retention policy for backup targets:
-#target_preserve            <NN>h <NN>d <NN>w <NN>m <NN>y
-
-# Retention policy for archives ("btrbk archive" command):
-#archive_preserve_min       no
-#archive_preserve           <NN>h <NN>d <NN>w <NN>m <NN>y
-
-# Enable compression for remote btrfs send/receive operations:
-#stream_compress            no
-#stream_compress_level      default
-#stream_compress_threads    default
-
-# Enable lock file support: Ensures that only one instance of btrbk
-# can be run at a time.
-lockfile                   /var/lock/btrbk.lock
-
-# Don't wait for transaction commit on deletion. Enable this to make
-# sure the deletion of subvolumes is committed to disk when btrbk
-# terminates.
-#btrfs_commit_delete no
-
-
-#
-# Volume section (optional): "volume <volume-directory>"
-#
-#   <volume-directory>  Base path within a btrfs filesystem
-#                       containing the subvolumes to be backuped
-#                       (usually the mount-point of a btrfs filesystem
-#                       mounted with subvolid=5 option).
-#
-# Subvolume section: "subvolume <subvolume-name>"
-#
-#   <subvolume-name>    Subvolume to be backuped, relative to
-#                       <volume-directory> in volume section.
-#
-# Target section: "target <type> <volume-directory>"
-#
-#   <type>              (optional) type, defaults to "send-receive".
-#   <volume-directory>  Directory within a btrfs filesystem
-#                       receiving the backups.
-#
-# NOTE: The parser does not care about indentation, this is only for
-# human readability. All options apply to the last section
-# encountered, overriding the corresponding option of the upper
-# section. This means that the global options must be set on top,
-# before any "volume", "subvolume" or "target section.
-#
-
-#
-# Example retention policy:
-#
-# snapshot_preserve_min   2d
-# snapshot_preserve       14d
-# target_preserve_min     no
-# target_preserve         20d 10w *m
-
-snapshot_preserve_min   2d
-snapshot_preserve       14d
-
-target_preserve_min     no
-target_preserve         14d 10w *m
-
-archive_preserve_min    latest
-archive_preserve        12m 10y
-
-# Global settings
-compat_remote busybox
-send_protocol 2
-
-# Root backup workaround, omit the volume section
-subvolume /
-  target_preserve 14d 10w 6m
-  snapshot_dir /.snapshots # Absolute path to snapshots dir
-  target /mnt/backup/workstation/root
-  # target ssh://router.lan/mnt/backup/workstation/root
-# target /run/media/bryan/backup/workstation/root
-# target ssh://home-router/mnt/backup/workstation/root
-
-volume /home
-  subvolume bryan
-    target /mnt/backup/workstation/home
-    # target ssh://router.lan/mnt/backup/workstation/home
-    target_preserve 14d 10w 6m
-    # target ssh://home-router/mnt/backup/workstation/home
-    # target /run/media/bryan/backup/workstation/home
-
-volume /mnt/downloads
-  subvolume downloads
-    target /mnt/backup/workstation/downloads
-    # target /run/media/bryan/backup/workstation/downloads
-
-#volume /mnt/array/media
-#  target /mnt/backup/media
-  # target ssh://router.lan/mnt/backup/media
-#  target ssh://home-router/mnt/backup/media
-#  subvolume music
-#    target_preserve_min all # for home-router to keep samba share (and safer overall)
-#  subvolume ebooks
-#  subvolume pictures
-
-# #
-# # Simple setup: Backup root and home to external disk
-# #
-# snapshot_dir /btrbk_snapshots
-# target       /mnt/btr_backup
-# subvolume    /
-# subvolume    /home
-
-
-# #
-# # Complex setup
-# #
-# # In order to keep things organized, it is recommended to use "volume"
-# # sections and mount the top-level subvolume (subvolid=5):
-# #
-# #  $ mount -o subvolid=5 /dev/sda1 /mnt/btr_pool
-# #
-# # Backup to external disk mounted on /mnt/btr_backup
-# volume /mnt/btr_pool
-#   # Create snapshots in /mnt/btr_pool/btrbk_snapshots
-#   snapshot_dir btrbk_snapshots
-
-#   # Target for all subvolume sections:
-#   target /mnt/btr_backup
-
-#   # Some default btrfs installations (e.g. Ubuntu) use "@" for rootfs
-#   # (mounted at "/") and "@home" (mounted at "/home"). Note that this
-#   # is only a naming convention.
-#   #subvolume @
-#   subvolume root
-#   subvolume home
-#   subvolume kvm
-#     # Use different retention policy for kvm backups:
-#     target_preserve 7d 4w
-
-
-# # Backup data to external disk as well as remote host
-# volume /mnt/btr_data
-#   subvolume  data
-#     # Always create snapshot, even if targets are unreachable
-#     snapshot_create always
-#     target /mnt/btr_backup
-#     target ssh://backup.my-remote-host.com/mnt/btr_backup
-
-
-# # Backup from remote host, with different naming
-# volume ssh://my-remote-host.com/mnt/btr_pool
-#   subvolume data_0
-#     snapshot_dir   snapshots/btrbk
-#     snapshot_name  data_main
-#     target /mnt/btr_backup/my-remote-host.com
-
-
-# # Backup on demand (noauto) to remote host running busybox, login as
-# # regular user using ssh-agent with current user name (ssh_user no)
-# # and default credentials (ssh_identity no).
-# volume /home
-#   noauto  yes
-#   compat  busybox
-#   backend_remote  btrfs-progs-sudo
-#   ssh_user      no
-#   ssh_identity  no
-
-#   target ssh://my-user-host.com/mnt/btr_backup/home
-#   subvolume  alice
-#   subvolume  bob
-
-
-# # Resume backups from remote host which runs its own btrbk instance
-# # creating snapshots for "home" in "/mnt/btr_pool/btrbk_snapshots".
-# volume ssh://my-remote-host.com/mnt/btr_pool
-#   snapshot_dir           btrbk_snapshots
-#   snapshot_create        no
-#   snapshot_preserve_min  all
-#   subvolume home
-#     target /mnt/btr_backup/my-remote-host.com

+ 0 - 24
dotfiles/deploy

@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-# Deploys the dotfiles in this directory using GNU stow
-set -euo pipefail
-
-# Get this script's directory
-SCRIPT_DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
-
-# Change to the dotfiles directory (push current dir on the stack)
-pushd "$SCRIPT_DIR" > /dev/null || exit 1
-
-# Loop through non-hidden top-level dirs and stow them
-for dir in */; do
-  [[ $dir == .* || $dir == secrets/ ]] && continue  # Skip dot-directories
-  echo "Stowing $dir"
-  if ! stow "$dir"; then
-    errorcode=$?
-    echo "Error stowing $dir"
-  fi
-done
-
-# Return to original directory
-popd > /dev/null || exit 1
-
-exit "${errorcode:-0}"

+ 0 - 8
dotfiles/git/.gitconfig

@@ -1,8 +0,0 @@
-# This is Git's per-user configuration file.
-[user]
-	email = bryanroessler@gmail.com
-	name = Bryan Roessler
-[color]
-	ui = auto
-[credential]
-	helper = cache

+ 0 - 31
dotfiles/tmux/.tmux.conf

@@ -1,31 +0,0 @@
-# Synchronize windows shortcut
-unbind a
-bind a set-window-option synchronize-panes
-
-# Use | and - to split a window vertically and horizontally instead of " and % respoectively
-unbind '"'
-unbind %
-bind | split-window -h -c "#{pane_current_path}"
-bind - split-window -v -c "#{pane_current_path}"
-
-# Automatically set window title
-set-window-option -g automatic-rename on
-set-option -g set-titles on
-
-# Use r to quickly reload tmux settings
-unbind r
-bind r \
-	source-file ~/.tmux.conf \;\
-	display 'Reloaded tmux config'
-
-# Set the history limit so we get lots of scrollback.
-setw -g history-limit 50000000
-
-# switch panes using Alt-arrow without prefix
-bind -n M-Left select-pane -L
-bind -n M-Right select-pane -R
-bind -n M-Up select-pane -U
-bind -n M-Down select-pane -D
-
-# Enable mouse mode
-set -g mouse on

+ 0 - 169
dotfiles/vim/.vimrc

@@ -1,169 +0,0 @@
-" File: .vimrc
-" Author: Jake Zimmerman <jake@zimmerman.io>
-"
-" How I configure Vim :P
-"
-
-" Gotta be first
-set nocompatible
-
-filetype off
-
-set rtp+=~/.vim/bundle/Vundle.vim
-call vundle#begin()
-
-Plugin 'VundleVim/Vundle.vim'
-
-" ----- Making Vim look good ------------------------------------------
-Plugin 'altercation/vim-colors-solarized'
-Plugin 'tomasr/molokai'
-Plugin 'vim-airline/vim-airline'
-Plugin 'vim-airline/vim-airline-themes'
-
-" ----- Vim as a programmer's text editor -----------------------------
-Plugin 'scrooloose/nerdtree'
-Plugin 'jistr/vim-nerdtree-tabs'
-Plugin 'vim-syntastic/syntastic'
-Plugin 'xolox/vim-misc'
-Plugin 'xolox/vim-easytags'
-Plugin 'majutsushi/tagbar'
-Plugin 'ctrlpvim/ctrlp.vim'
-Plugin 'vim-scripts/a.vim'
-
-" ----- Working with Git ----------------------------------------------
-Plugin 'airblade/vim-gitgutter'
-Plugin 'tpope/vim-fugitive'
-
-" ----- Other text editing features -----------------------------------
-Plugin 'Raimondi/delimitMate'
-
-" ----- man pages, tmux -----------------------------------------------
-Plugin 'jez/vim-superman'
-Plugin 'christoomey/vim-tmux-navigator'
-
-" ----- Syntax plugins ------------------------------------------------
-Plugin 'jez/vim-c0'
-Plugin 'jez/vim-ispc'
-Plugin 'kchmck/vim-coffee-script'
-
-" ---- Extras/Advanced plugins ----------------------------------------
-" Highlight and strip trailing whitespace
-"Plugin 'ntpeters/vim-better-whitespace'
-" Easily surround chunks of text
-"Plugin 'tpope/vim-surround'
-" Align CSV files at commas, align Markdown tables, and more
-"Plugin 'godlygeek/tabular'
-" Automaticall insert the closing HTML tag
-"Plugin 'HTML-AutoCloseTag'
-" Make tmux look like vim-airline (read README for extra instructions)
-"Plugin 'edkolev/tmuxline.vim'
-" All the other syntax plugins I use
-"Plugin 'ekalinin/Dockerfile.vim'
-"Plugin 'digitaltoad/vim-jade'
-"Plugin 'tpope/vim-liquid'
-"Plugin 'cakebaker/scss-syntax.vim'
-
-call vundle#end()
-
-filetype plugin indent on
-
-" --- General settings ---
-set backspace=indent,eol,start
-set ruler
-set number
-set showcmd
-set incsearch
-set hlsearch
-
-syntax on
-
-set mouse=a
-
-" We need this for plugins like Syntastic and vim-gitgutter which put symbols
-" in the sign column.
-hi clear SignColumn
-
-" ----- Plugin-Specific Settings --------------------------------------
-
-" ----- altercation/vim-colors-solarized settings -----
-" Toggle this to "light" for light colorscheme
-set background=dark
-
-" Uncomment the next line if your terminal is not configured for solarized
-let g:solarized_termcolors=256
-
-" Set the colorscheme
-colorscheme solarized
-
-
-" ----- bling/vim-airline settings -----
-" Always show statusbar
-set laststatus=2
-
-" Fancy arrow symbols, requires a patched font
-" To install a patched font, run over to
-"     https://github.com/abertsch/Menlo-for-Powerline
-" download all the .ttf files, double-click on them and click "Install"
-" Finally, uncomment the next line
-"let g:airline_powerline_fonts = 1
-
-" Show PASTE if in paste mode
-let g:airline_detect_paste=1
-
-" Show airline for tabs too
-let g:airline#extensions#tabline#enabled = 1
-
-" Use the solarized theme for the Airline status bar
-let g:airline_theme='solarized'
-
-" ----- jistr/vim-nerdtree-tabs -----
-" Open/close NERDTree Tabs with \t
-nmap <silent> <leader>t :NERDTreeTabsToggle<CR>
-" To have NERDTree always open on startup
-let g:nerdtree_tabs_open_on_console_startup = 1
-
-" ----- scrooloose/syntastic settings -----
-let g:syntastic_error_symbol = '✘'
-let g:syntastic_warning_symbol = "▲"
-augroup mySyntastic
-  au!
-  au FileType tex let b:syntastic_mode = "passive"
-augroup END
-
-
-" ----- xolox/vim-easytags settings -----
-" Where to look for tags files
-set tags=./tags;,~/.vimtags
-" Sensible defaults
-let g:easytags_events = ['BufReadPost', 'BufWritePost']
-let g:easytags_async = 1
-let g:easytags_dynamic_files = 2
-let g:easytags_resolve_links = 1
-let g:easytags_suppress_ctags_warning = 1
-
-" ----- majutsushi/tagbar settings -----
-" Open/close tagbar with \b
-nmap <silent> <leader>b :TagbarToggle<CR>
-" Uncomment to open tagbar automatically whenever possible
-"autocmd BufEnter * nested :call tagbar#autoopen(0)
-
-
-" ----- airblade/vim-gitgutter settings -----
-" In vim-airline, only display "hunks" if the diff is non-zero
-let g:airline#extensions#hunks#non_zero_only = 1
-
-
-" ----- Raimondi/delimitMate settings -----
-let delimitMate_expand_cr = 1
-augroup mydelimitMate
-  au!
-  au FileType markdown let b:delimitMate_nesting_quotes = ["`"]
-  au FileType tex let b:delimitMate_quotes = ""
-  au FileType tex let b:delimitMate_matchpairs = "(:),[:],{:},`:'"
-  au FileType python let b:delimitMate_nesting_quotes = ['"', "'"]
-augroup END
-
-" ----- jez/vim-superman settings -----
-" better man page support
-noremap K :SuperMan <cword><CR>
-

+ 0 - 133
dotfiles/zsh/.zshrc

@@ -1,133 +0,0 @@
-# Shell options
-setopt autocd correct globdots extendedglob nomatch notify \
-  share_history inc_append_history hist_expire_dups_first hist_reduce_blanks \
-  hist_find_no_dups hist_verify extended_history auto_pushd pushd_ignore_dups \
-  prompt_subst
-unsetopt beep
-bindkey -e
-
-# Load secrets
-if [[ -f .env ]]; then
-  set -a # automatically export all variables
-  source .env
-  set +a
-fi
-
-# Completions
-local compdump=${XDG_CACHE_HOME:-$HOME/.cache}/zsh/zcompdump-${HOST}-${ZSH_VERSION}
-[[ -d ${compdump:h} ]] || mkdir -p ${compdump:h}
-zstyle ':completion:*' menu select
-zstyle ':completion:*' gain-privileges 1
-zstyle ':completion:*:descriptions' format '%U%B%d%b%u'
-zmodload zsh/complist
-autoload -Uz compinit && compinit -d "$compdump"
-
-# History
-HISTFILE=${XDG_STATE_HOME:-$HOME}/.histfile
-[[ -d $HISTFILE:h ]] || mkdir -p $HISTFILE:h
-HISTSIZE=1000000
-SAVEHIST=1000000
-autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
-zle -N up-line-or-beginning-search
-zle -N down-line-or-beginning-search
-
-# Colors
-autoload -Uz colors && colors
-
-# Prompt
-if [[ $EUID -eq 0 ]]; then
-  user_color=red
-else
-  user_color=white
-fi
-
-# Assign colors based on the hostname
-if [[ -v TOOLBOX_PATH ]]; then
-  host_color=magenta
-elif [[ -v DISTROBOX_ENTER_PATH ]]; then
-  host_color=15
-else
-  case $HOSTNAME in
-    laptop)       host_color=green ;;
-    workstation)  host_color=red ;;
-    bryan-pc)     host_color=cyan ;;
-    time4vps)     host_color=blue ;;
-    racknerd)     host_color=yellow ;;
-    htpc)         host_color=214 ;;
-    hartmanlab)   host_color=magenta ;;
-    router)       host_color=blue ;;
-    ax6000)       host_color=87 ;;
-    home-router)  host_color=218 ;;
-    vm-fedora*)   host_color=57 ;;
-    *)            host_color=white ;;
-  esac
-fi
-
-_git_prompt() {
-  local br
-  if br=$(git symbolic-ref --short HEAD 2>/dev/null); then
-    print -n " %F{242}($br)%f"
-  fi
-}
-
-PROMPT='[%F{'$user_color'}%n%f@%F{'$host_color'}%m%f]%~$(_git_prompt)%(!.#.$) '
-# RPROMPT='%*' # display clock to right of screen
-precmd() { print -Pn "\e]0;%n@%m: ${PWD/#$HOME/~}\a" ; }
-
-# Set hostname on OpenWRT
-[[ -z $HOSTNAME ]] && HOSTNAME=$(noglob uci get system.@system[0].hostname 2>/dev/null)
-
-# Paths
-typeset -U path PATH
-path=(
-  $HOME/bin
-  $HOME/.local/bin
-  $HOME/documents/develop/scripts/shell
-  $path
-)
-export PATH
-export R_LIBS_USER="$HOME/R/qhtcp-workflow"
-
-# Keybindings
-typeset -g -A key
-for k v in \
-  Home khome End kend Insert kich1 Backspace kbs Delete kdch1 \
-  Up kcuu1 Down kcud1 Left kcub1 Right kcuf1 PageUp kpp PageDown knp ShiftTab kcbt; do
-  [[ -n ${terminfo[$v]} ]] && key[$k]=${terminfo[$v]}
-done
-bindkey -- ${key[Home]-}      beginning-of-line
-bindkey -- ${key[End]-}       end-of-line
-bindkey -- ${key[Insert]-}    overwrite-mode
-bindkey -- ${key[Backspace]-} backward-delete-char
-bindkey -- ${key[Delete]-}    delete-char
-bindkey -- ${key[Left]-}      backward-char
-bindkey -- ${key[Right]-}     forward-char
-bindkey -- ${key[PageUp]-}    beginning-of-buffer-or-history
-bindkey -- ${key[PageDown]-}  end-of-buffer-or-history
-bindkey -- ${key[ShiftTab]-}  reverse-menu-complete
-bindkey -- ${key[Up]-}        up-line-or-beginning-search
-bindkey -- ${key[Down]-}      down-line-or-beginning-search
-
-if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then
-  autoload -Uz add-zle-hook-widget
-  zle_app_start()  { echoti smkx; }
-  zle_app_finish() { echoti rmkx; }
-  add-zle-hook-widget zle-line-init    zle_app_start
-  add-zle-hook-widget zle-line-finish  zle_app_finish
-fi
-
-# Aliases and one-liners
-alias ll='ls -lh'
-alias la='ls -A'
-alias vmd='vmd -nt'
-alias dnf-list-files='dnf repoquery -l'
-alias gedit='gnome-text-editor'
-alias xclip='xclip -selection c'
-alias pdoman='podman'
-alias workon='virtualenv-workon'
-alias git-list='git ls-tree -r HEAD --name-only'
-alias chatgpt='chatgpt --model gpt-4o'
-podman-update-images() {
-  podman images --format '{{.Repository}}' | grep -v '^<none>$' | xargs -r -L1 podman pull
-}
-buildah-prune() { buildah rm --all; }

+ 20 - 0
shell/dotfiles-store

@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+dotfiles-store() {
+  local subdir=$1; shift
+  local dotdir=~/scripts/dotfiles
+  mkdir -p "$dotdir/$subdir"
+  for src in "$@"; do
+    local filename
+    filename=$(basename "$src")
+    local dest="$dotdir/$subdir/$filename"
+    cp -ai "$src" "$dest" || { echo "Failed to copy $src"; continue; }
+    ln -sf "$dest" "$src"
+    echo "Moved $src → $dest and linked $src → $dest"
+  done
+}
+
+# Allow this file to be executed directly if not being sourced
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+    dotfiles-store "$@"
+fi

+ 28 - 0
shell/iso-to-mkv

@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+SEARCH_DIR="${1:-$(pwd)}"
+OUT_DIR="${2:-"$SEARCH_DIR/out"}"
+mkdir -p "$OUT_DIR"
+prev_season=""
+ep=1
+
+find "$SEARCH_DIR" -type f -iname '*.iso' | sort | while read -r iso; do
+  echo "$iso"
+  parent=$(basename "$(dirname "$iso")")
+  [[ $parent =~ S([0-9]+) ]] || continue
+  season=$(printf "%02d" "${BASH_REMATCH[1]}")
+
+  [[ $season != "$prev_season" ]] && { ep=1; prev_season=$season; }
+
+  ripdir="$OUT_DIR/temp/$parent"
+  mkdir -p "$ripdir" "$OUT_DIR/Season $season"
+  snap run makemkv.makemkvcon -r mkv --minlength=1800 iso:"$iso" all "$ripdir"
+
+  for mkv in "$ripdir"/*.mkv; do
+    out="$OUT_DIR/Season $season/S${season}E$(printf "%02d" "$ep").mkv"
+    ffmpeg -nostdin -hide_banner -loglevel error -i "$mkv" \
+      -map 0:v -map 0:a:m:language:eng -map 0:s:m:language:eng \
+      -c copy "$out"
+    rm "$mkv"
+    ((ep++))
+  done
+done

+ 1 - 1
shell/tmux-management

@@ -6,7 +6,7 @@
 set -euo pipefail
 
 # Configuration (override with env vars if desired)
-HOSTS=(workstation laptop vm-fedora42) # hosts in pane order
+HOSTS=(workstation laptop) # hosts in pane order
 REMOTE_SESSION=${REMOTE_SESSION:-main} # tmux session on remotes
 SYNCHRONIZE=${SYNCHRONIZE:-1} # 1 = broadcast keystrokes
 INCLUDE_LOCAL=${INCLUDE_LOCAL:-1} # 0 = skip local host