Commit 2417b81e8317

Vincent Demeester <vincent@sbr.pm>
2026-04-16 11:21:52
feat: add Light Phone (suzu) Termux config and SSH key
Added declarative Termux setup for suzu mirroring the Boox config with dark theme, compact prompt (40 char path limit), and shared SSH config generator. Added suzu-termux SSH key to globals and make targets.
1 parent 5d3f637
android/suzu/bin/sp
@@ -0,0 +1,41 @@
+#!/data/data/com.termux/files/usr/bin/bash
+# sp - shpool session wrapper for Boox (uses mosh for resilience)
+# Usage: sp <host> [session]    — attach to shpool session via mosh
+#        sp -s <host> [session] — use plain SSH instead of mosh
+#        sp <host>              — attach to 'default' session
+#        sp                     — show usage
+set -euo pipefail
+
+USE_SSH=0
+if [ "${1:-}" = "-s" ]; then
+    USE_SSH=1
+    shift
+fi
+
+if [ $# -eq 0 ]; then
+    echo "Usage: sp [-s] <host> [session]"
+    echo ""
+    echo "Options:"
+    echo "  -s    Use SSH instead of mosh"
+    echo ""
+    echo "Examples:"
+    echo "  sp rhea          # mosh to 'default' session on rhea.vpn"
+    echo "  sp rhea dev      # mosh to 'dev' session on rhea.vpn"
+    echo "  sp -s rhea dev   # SSH to 'dev' session on rhea.vpn"
+    exit 0
+fi
+
+HOST="$1"
+SESSION="${2:-default}"
+
+# Append .vpn if not already qualified
+case "$HOST" in
+    *.vpn|*.home|*.sbr.pm) ;;
+    *) HOST="${HOST}.vpn" ;;
+esac
+
+if [ "$USE_SSH" -eq 1 ]; then
+    exec ssh -t "$HOST" "shpool-ssh-wrapper ${SESSION}"
+else
+    exec mosh "$HOST" -- shpool-ssh-wrapper "${SESSION}"
+fi
android/suzu/generate-ssh-config.nix
@@ -0,0 +1,1 @@
+../boox/generate-ssh-config.nix
\ No newline at end of file
android/suzu/ssh_config
@@ -0,0 +1,218 @@
+# Boox (osaka) SSH config — auto-generated from globals.nix
+# Do not edit manually! Regenerate with: make boox/ssh-config
+#
+# Generated entries: VPN, LAN, and .sbr.pm hosts
+
+Host *
+    ServerAliveInterval 60
+    AddKeysToAgent yes
+    IdentityFile ~/.ssh/id_ed25519
+    StrictHostKeyChecking accept-new
+
+# === Homelab ===
+
+Host aion.vpn
+    HostName 10.100.0.49
+    User vincent
+
+Host aion.sbr.pm
+    HostName aion.sbr.pm
+    User vincent
+
+Host aion.home
+    HostName 192.168.1.49
+    User vincent
+
+Host aix.vpn
+    HostName 10.100.0.89
+    User vincent
+
+Host aix.sbr.pm
+    HostName aix.sbr.pm
+    User vincent
+
+Host aomi.vpn
+    HostName 10.100.0.17
+    User vincent
+
+Host aomi.sbr.pm
+    HostName aomi.sbr.pm
+    User vincent
+
+Host aomi.home
+    HostName 192.168.1.23
+    User vincent
+
+Host athena.vpn
+    HostName 10.100.0.83
+    User vincent
+
+Host athena.sbr.pm
+    HostName athena.sbr.pm
+    User vincent
+
+Host athena.home
+    HostName 192.168.1.183
+    User vincent
+
+Host carthage.vpn
+    HostName 10.100.0.1
+    User vincent
+
+Host carthage.sbr.pm
+    HostName carthage.sbr.pm
+    User vincent
+
+Host demeter.vpn
+    HostName 10.100.0.82
+    User vincent
+
+Host demeter.sbr.pm
+    HostName demeter.sbr.pm
+    User vincent
+
+Host demeter.home
+    HostName 192.168.1.182
+    User vincent
+
+Host hass.vpn
+    HostName 10.100.0.81
+    User vincent
+
+Host hass.sbr.pm
+    HostName hass.sbr.pm
+    User vincent
+
+Host hass.home
+    HostName 192.168.1.181
+    User vincent
+
+Host hokkaido.vpn
+    HostName 10.100.0.5
+    User vincent
+
+Host hokkaido.sbr.pm
+    HostName hokkaido.sbr.pm
+    User vincent
+
+Host hokkaido.home
+    HostName 192.168.1.115
+    User vincent
+
+Host kerkouane.vpn
+    HostName 10.100.0.1
+    User vincent
+
+Host kerkouane.sbr.pm
+    HostName kerkouane.sbr.pm
+    User vincent
+
+Host kyushu.vpn
+    HostName 10.100.0.19
+    User vincent
+
+Host kyushu.sbr.pm
+    HostName kyushu.sbr.pm
+    User vincent
+
+Host kyushu.home
+    HostName 192.168.1.36
+    User vincent
+
+Host nagoya.vpn
+    HostName 10.100.0.80
+    User vincent
+
+Host nagoya.sbr.pm
+    HostName nagoya.sbr.pm
+    User vincent
+
+Host nagoya.home
+    HostName 192.168.1.80
+    User vincent
+
+Host okinawa.vpn
+    HostName 10.100.0.14
+    User vincent
+
+Host okinawa.sbr.pm
+    HostName okinawa.sbr.pm
+    User vincent
+
+Host okinawa.home
+    HostName 192.168.1.42
+    User vincent
+
+Host osaka.vpn
+    HostName 10.100.0.64
+    User vincent
+
+Host osaka.sbr.pm
+    HostName osaka.sbr.pm
+    User vincent
+
+Host rhea.vpn
+    HostName 10.100.0.50
+    User vincent
+
+Host rhea.sbr.pm
+    HostName rhea.sbr.pm
+    User vincent
+
+Host rhea.home
+    HostName 192.168.1.50
+    User vincent
+
+Host sakhalin.vpn
+    HostName 10.100.0.16
+    User vincent
+
+Host sakhalin.sbr.pm
+    HostName sakhalin.sbr.pm
+    User vincent
+
+Host sakhalin.home
+    HostName 192.168.1.70
+    User vincent
+
+Host shikoku.vpn
+    HostName 10.100.0.2
+    User vincent
+
+Host shikoku.sbr.pm
+    HostName shikoku.sbr.pm
+    User vincent
+
+Host shikoku.home
+    HostName 192.168.1.24
+    User vincent
+
+Host suzu.vpn
+    HostName 10.100.0.65
+    User vincent
+
+Host suzu.sbr.pm
+    HostName suzu.sbr.pm
+    User vincent
+
+Host wakasu.vpn
+    HostName 10.100.0.8
+    User vincent
+
+Host wakasu.sbr.pm
+    HostName wakasu.sbr.pm
+    User vincent
+
+# === Git forges ===
+
+Host github.com
+    User git
+    IdentityFile ~/.ssh/id_ed25519
+
+Host gitlab.com
+    User git
+    IdentityFile ~/.ssh/id_ed25519
+
+Host codeberg.org
+    User git
+    IdentityFile ~/.ssh/id_ed25519
android/suzu/sync.sh
@@ -0,0 +1,43 @@
+#!/data/data/com.termux/files/usr/bin/bash
+# Sync Light Phone (suzu) Termux config from the home repo
+# Run after cloning: ~/src/home/android/suzu/sync.sh
+set -euo pipefail
+
+SUZU_DIR="$HOME/src/home/android/suzu"
+
+if [ ! -d "$SUZU_DIR" ]; then
+    echo "Error: home repo not found at ~/src/home"
+    echo "Clone it first: git clone <repo> ~/src/home"
+    exit 1
+fi
+
+echo "==> Installing packages..."
+pkg install -y openssh git zsh curl wget rsync jq mosh htop 2>/dev/null || true
+
+echo "==> Syncing SSH config..."
+mkdir -p ~/.ssh
+chmod 700 ~/.ssh
+ln -snf "$SUZU_DIR/ssh_config" ~/.ssh/config
+chmod 600 ~/.ssh/config 2>/dev/null || true
+
+echo "==> Syncing Termux config..."
+mkdir -p ~/.termux
+ln -snf "$SUZU_DIR/termux.properties" ~/.termux/termux.properties
+# Keep default dark colors — no colors.properties override
+
+echo "==> Syncing shell config..."
+ln -snf "$SUZU_DIR/zshrc" ~/.zshrc
+
+echo "==> Syncing bin..."
+mkdir -p ~/bin
+for f in "$SUZU_DIR"/bin/*; do
+    ln -snf "$f" ~/bin/"$(basename "$f")"
+done
+
+echo "==> Reloading Termux settings..."
+termux-reload-settings 2>/dev/null || true
+
+echo "==> Pulling latest from repo..."
+(cd ~/src/home && git pull --ff-only 2>/dev/null || echo "  ⚠️  Could not fast-forward, run git pull manually")
+
+echo "✅ Sync complete!"
android/suzu/termux.properties
@@ -0,0 +1,23 @@
+# Termux properties for Light Phone (suzu)
+
+# Extra keys row — essential on a small phone screen
+extra-keys = [['ESC','/','-','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]
+
+# Bell
+bell-character = vibrate
+
+# Terminal
+terminal-margin-horizontal = 2
+terminal-margin-vertical = 2
+
+# Keyboard
+enforce-char-based-input = true
+
+# Handle links
+terminal-onclick-url-open = true
+
+# Allow external apps
+allow-external-apps = true
+
+# Back key behavior
+back-key = escape
android/suzu/zshrc
@@ -0,0 +1,94 @@
+# Light Phone (suzu) Termux zsh config
+
+# Identity
+export USER="vincent"
+
+# PATH
+export PATH="$HOME/bin:$PATH"
+
+# Prompt — matching homelab style, compact for small screen
+_shorten_path() {
+  local p="$1" max="${2:-40}"
+  (( ${#p} <= max )) && { echo "$p"; return; }
+  local parts=("${(@s:/:)p}")
+  local len=${#parts[@]}
+  local i
+  for (( i=1; i <= len - 2; i++ )); do
+    (( ${#p} <= max )) && break
+    (( ${#parts[$i]} <= 2 )) && continue
+    if [[ "${parts[$i]}" == .* ]]; then
+      parts[$i]=".${parts[$i]:1:1}"
+    else
+      parts[$i]="${parts[$i]:0:1}"
+    fi
+    p="${(j:/:)parts}"
+  done
+  echo "$p"
+}
+
+_prompt_dir() {
+  local dir="${PWD/#$HOME/~}"
+  if (( ${#dir} > 40 )); then
+    dir=$(_shorten_path "$dir" 40)
+  fi
+  echo "$dir"
+}
+
+_prompt_git_branch() {
+  local branch
+  branch=$(git symbolic-ref --short HEAD 2>/dev/null)
+  [[ -n $branch ]] && echo " $branch"
+}
+
+setopt PROMPT_SUBST
+export PROMPT='%m:$(_prompt_dir)$(_prompt_git_branch) %(!.#.$) '
+
+# History
+HISTFILE=~/.zsh_history
+HISTSIZE=5000
+SAVEHIST=5000
+setopt SHARE_HISTORY
+setopt HIST_IGNORE_DUPS
+setopt HIST_IGNORE_SPACE
+
+# Completion
+autoload -Uz compinit && compinit -C
+zstyle ':completion:*' menu select
+
+# Key bindings
+bindkey -e
+bindkey '^[[A' up-line-or-search
+bindkey '^[[B' down-line-or-search
+
+# === Aliases ===
+
+# Homelab SSH shortcuts
+alias athena='ssh athena.vpn'
+alias demeter='ssh demeter.vpn'
+alias rhea='ssh rhea.vpn'
+alias aion='ssh aion.vpn'
+alias kerkouane='ssh kerkouane.vpn'
+alias shikoku='ssh shikoku.vpn'
+alias nagoya='ssh nagoya.vpn'
+alias kyushu='ssh kyushu.vpn'
+alias aomi='ssh aomi.vpn'
+alias sakhalin='ssh sakhalin.vpn'
+alias okinawa='ssh okinawa.vpn'
+alias wakasu='ssh wakasu.vpn'
+
+# General
+alias ll='ls -la'
+alias la='ls -A'
+alias ..='cd ..'
+alias ...='cd ../..'
+
+# Git
+alias gs='git status'
+alias gl='git log --oneline -20'
+alias gp='git pull --ff-only'
+
+# Sync config from repo
+alias suzu-sync='~/src/home/android/suzu/sync.sh'
+
+# Quick access
+alias home='cd ~/src/home'
globals.nix
@@ -18,6 +18,8 @@ _: {
       "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGThdcaPfIaB7d+K5uODqEusLKGI5ZCye0aNOCaMoInO Kyushu's ssh key"
       # Boox (osaka) Termux
       "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICa0SyAspL7PBPudCjb7oCBG17WRmYnDQF7/BYkFwqDi oksaka-termux"
+      # Light Phone (suzu) Termux
+      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK0Q1oXzMMJG03n2VoxKKOGruyGBy8V8yanqgeeUYm+N suzu-termux"
     ];
   };
   syncthingFolders = {
Makefile
@@ -91,11 +91,17 @@ fmt: ## Format Nix files
 dots: ## Build dotfiles
 	@$(MAKE) -C dots
 
-.PHONY: boox/ssh-config
+.PHONY: boox/ssh-config suzu/ssh-config android/ssh-config
 boox/ssh-config: ## Generate Boox SSH config from globals.nix
 	nix eval --raw -f android/boox/generate-ssh-config.nix > android/boox/ssh_config
 	@echo "✅ android/boox/ssh_config regenerated"
 
+suzu/ssh-config: ## Generate Light Phone SSH config from globals.nix
+	nix eval --raw -f android/suzu/generate-ssh-config.nix > android/suzu/ssh_config
+	@echo "✅ android/suzu/ssh_config regenerated"
+
+android/ssh-config: boox/ssh-config suzu/ssh-config ## Regenerate all Android SSH configs
+
 ##@ Keyboards
 
 .PHONY: keyboards keyboards/moonlander/build keyboards/moonlander/flash keyboards/moonlander/update keyboards/moonlander/clean