Index: scripts/install.sh
===================================================================
--- scripts/install.sh	(revision 83088b667063c7b6ad2799b977df29bcf23593af)
+++ scripts/install.sh	(revision bb42dfb3c61f3495f4ebd21e0066a369b7d0a202)
@@ -1,25 +1,25 @@
 #!/usr/bin/env bash
 #
-# Klonkt — installer voor een Debian/Ubuntu VPS.
-# Installeert Node 20, Caddy (automatische HTTPS) en Klonkt als systemd-service.
-#
-# Veilig op een server die AL iets draait: upgradet je systeem-Node niet,
-# kiest automatisch een vrije poort, en slaat Caddy over als er al een
-# webserver/reverse-proxy op poort 80/443 luistert (dan krijg je instructies
-# om Klonkt achter je eigen proxy te zetten).
-#
-# Gebruik (als root), niet-interactief:
+# Klonkt — installer for a Debian/Ubuntu VPS.
+# Installs Node 20, Caddy (automatic HTTPS) and Klonkt as a systemd service.
+#
+# Safe on a server that ALREADY runs things: it won't upgrade your system Node,
+# auto-picks a free port, and skips Caddy if a webserver/reverse-proxy is already
+# listening on port 80/443 (you then get instructions to put Klonkt behind your
+# own proxy).
+#
+# Usage (as root), non-interactive:
 #   curl -fsSL https://raw.githubusercontent.com/roboburr/klonkt/main/scripts/install.sh \
-#     | sudo bash -s -- --domain klonkt.voorbeeld.nl
-# Of interactief vanaf een gedownload bestand:
+#     | sudo bash -s -- --domain klonkt.example.com
+# Or interactively from a downloaded file:
 #   sudo bash install.sh
 #
-# Opnieuw draaien op dezelfde server = bijwerken (git pull + herstart).
-# Volledig geïsoleerd alternatief: Docker (zie docker-compose.yml in de repo).
+# Re-running on the same server = update (git pull + restart).
+# Fully isolated alternative: Docker (see docker-compose.yml in the repo).
 #
 set -euo pipefail
 
-# ── Instellingen (override via env-variabele of vlag) ──────────────────────
-KLONKT_REPO="${KLONKT_REPO:-https://github.com/roboburr/klonkt.git}"  # TODO: echte GitHub-URL
+# ── Settings (override via env var or flag) ────────────────────────────────
+KLONKT_REPO="${KLONKT_REPO:-https://github.com/roboburr/klonkt.git}"
 KLONKT_BRANCH="${KLONKT_BRANCH:-main}"
 KLONKT_DIR="${KLONKT_DIR:-/opt/klonkt}"
@@ -29,6 +29,6 @@
 KLONKT_LANG="${KLONKT_DEFAULT_LANG:-}"
 NODE_MAJOR="${NODE_MAJOR:-20}"
-NO_CADDY="${KLONKT_NO_CADDY:-}"     # zet op 1 om Caddy NOOIT te installeren (eigen proxy)
-NODE_FORCE="${NODE_FORCE:-}"        # zet op 1 om systeem-Node tóch te (her)installeren
+NO_CADDY="${KLONKT_NO_CADDY:-}"     # set to 1 to NEVER install Caddy (own proxy)
+NODE_FORCE="${NODE_FORCE:-}"        # set to 1 to (re)install system Node anyway
 PORT_EXPLICIT=0
 
@@ -44,5 +44,5 @@
     --force-node) NODE_FORCE=1; shift;;
     -h|--help) grep '^#' "$0" | sed 's/^# \{0,1\}//'; exit 0;;
-    *) echo "Onbekende optie: $1" >&2; exit 1;;
+    *) echo "Unknown option: $1" >&2; exit 1;;
   esac
 done
@@ -55,26 +55,26 @@
 port_busy() { ss -ltnH 2>/dev/null | awk '{print $4}' | grep -qE "[:.]${1}$"; }
 
-[ "$(id -u)" = 0 ] || die "Draai dit als root (sudo bash install.sh)."
-command -v apt-get >/dev/null || die "Alleen Debian/Ubuntu (apt). Gebruik op andere systemen de Docker-route."
+[ "$(id -u)" = 0 ] || die "Run this as root (sudo bash install.sh)."
+command -v apt-get >/dev/null || die "Debian/Ubuntu only (apt). On other systems use the Docker route."
 
 if [ -z "$KLONKT_DOMAIN" ]; then
-  read -rp "Domein voor Klonkt (bv. klonkt.voorbeeld.nl): " KLONKT_DOMAIN </dev/tty || true
-fi
-[ -n "$KLONKT_DOMAIN" ] || die "Geen domein opgegeven (--domain of KLONKT_DOMAIN)."
+  read -rp "Domain for Klonkt (e.g. klonkt.example.com): " KLONKT_DOMAIN </dev/tty || true
+fi
+[ -n "$KLONKT_DOMAIN" ] || die "No domain given (--domain or KLONKT_DOMAIN)."
 case "$KLONKT_REPO" in
-  *OWNER/*) die "Zet eerst de echte repo-URL: --repo https://github.com/<jij>/klonkt.git (of KLONKT_REPO=...).";;
+  *OWNER/*) die "Set the real repo URL first: --repo https://github.com/<you>/klonkt.git (or KLONKT_REPO=...).";;
 esac
 
 export DEBIAN_FRONTEND=noninteractive
 
-# ── Preflight: kijk wat er al draait, pas je aan i.p.v. clobberen ──────────
-log "Preflight (wat draait er al?)…"
+# ── Preflight: see what's already running, adapt instead of clobbering ──────
+log "Preflight (what's already running?)…"
 apt-get update -y >/dev/null
 apt-get install -y iproute2 >/dev/null 2>&1 || true
 
-# Poort: bezet? Bij --port → fout. Anders automatisch een vrije kiezen.
+# Port: busy? With --port → error. Otherwise auto-pick a free one.
 if port_busy "$KLONKT_PORT"; then
   if [ "$PORT_EXPLICIT" = 1 ]; then
-    die "Poort ${KLONKT_PORT} is al in gebruik. Kies een vrije poort met --port."
+    die "Port ${KLONKT_PORT} is already in use. Pick a free port with --port."
   fi
   picked=""
@@ -82,41 +82,41 @@
     port_busy "$p" || { picked="$p"; break; }
   done
-  [ -n "$picked" ] || die "Geen vrije poort gevonden rond ${KLONKT_PORT}. Geef er een met --port."
-  warn "poort ${KLONKT_PORT} bezet → Klonkt gebruikt ${picked}"
+  [ -n "$picked" ] || die "No free port found near ${KLONKT_PORT}. Provide one with --port."
+  warn "port ${KLONKT_PORT} busy → Klonkt uses ${picked}"
   KLONKT_PORT="$picked"
 else
-  ok "poort ${KLONKT_PORT} vrij"
-fi
-
-# Webserver op 80/443 die niet Caddy is? → Caddy overslaan, eigen-proxy-modus.
+  ok "port ${KLONKT_PORT} free"
+fi
+
+# Webserver on 80/443 that isn't Caddy? → skip Caddy, own-proxy mode.
 FOREIGN_PROXY=0
 if [ -z "$NO_CADDY" ] && command -v ss >/dev/null 2>&1; then
   if ss -ltnpH 2>/dev/null | grep -E '[:.](80|443) ' | grep -viq 'caddy'; then
     NO_CADDY=1; FOREIGN_PROXY=1
-    warn "er luistert al iets op poort 80/443 (geen Caddy) → ik installeer Caddy NIET en geef je proxy-instructies"
-  fi
-fi
-
-# ── Node: bestaande versie respecteren, niet stilletjes upgraden ──────────
+    warn "something is already listening on port 80/443 (not Caddy) → NOT installing Caddy; you'll get proxy instructions"
+  fi
+fi
+
+# ── Node: respect an existing version, don't silently upgrade ──────────────
 log "Node ${NODE_MAJOR}.x…"
 if command -v node >/dev/null 2>&1 && [ -z "$NODE_FORCE" ]; then
   CUR="$(node -v | sed 's/v//;s/\..*//')"
   if [ "$CUR" -lt "$NODE_MAJOR" ]; then
-    die "Er staat al Node $(node -v) op deze server; Klonkt heeft ≥${NODE_MAJOR} nodig.
-   Ik upgrade je systeem-Node NIET automatisch — dat kan andere apps breken.
-   Opties: (a) gebruik de Docker-route (eigen Node, raakt niets aan), of
-           (b) upgrade Node zelf, of (c) forceer met NODE_FORCE=1 (eigen risico)."
-  fi
-  ok "bestaande node $(node -v) wordt gebruikt"
+    die "Node $(node -v) is already installed on this server; Klonkt needs ≥${NODE_MAJOR}.
+   I will NOT auto-upgrade your system Node — that could break other apps.
+   Options: (a) use the Docker route (own Node, touches nothing), or
+            (b) upgrade Node yourself, or (c) force with NODE_FORCE=1 (at your own risk)."
+  fi
+  ok "using existing node $(node -v)"
 else
   curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash -
   apt-get install -y nodejs
-  ok "node $(node -v) geïnstalleerd"
-fi
-
-log "Overige pakketten…"
+  ok "node $(node -v) installed"
+fi
+
+log "Other packages…"
 apt-get install -y curl ca-certificates git gnupg openssl build-essential python3
-apt-get install -y webp >/dev/null 2>&1 || true   # cwebp = afbeelding→WebP (optioneel)
-ok "basis-pakketten"
+apt-get install -y webp >/dev/null 2>&1 || true   # cwebp = image→WebP (optional)
+ok "base packages"
 
 if [ -z "$NO_CADDY" ]; then
@@ -128,12 +128,12 @@
     apt-get install -y caddy
   fi
-  ok "caddy aanwezig"
-fi
-
-log "Service-gebruiker '${KLONKT_USER}'…"
+  ok "caddy present"
+fi
+
+log "Service user '${KLONKT_USER}'…"
 id -u "$KLONKT_USER" >/dev/null 2>&1 || useradd --system --home-dir "$KLONKT_DIR" --shell /usr/sbin/nologin "$KLONKT_USER"
-ok "gebruiker"
-
-log "Klonkt-broncode ophalen…"
+ok "user"
+
+log "Fetching Klonkt source…"
 if [ -d "$KLONKT_DIR/.git" ]; then
   git -C "$KLONKT_DIR" remote set-url origin "$KLONKT_REPO"
@@ -141,5 +141,5 @@
   git -C "$KLONKT_DIR" reset --hard "origin/$KLONKT_BRANCH"
 else
-  [ -e "$KLONKT_DIR" ] && [ -n "$(ls -A "$KLONKT_DIR" 2>/dev/null)" ] && die "$KLONKT_DIR bestaat al en is geen git-checkout. Kies --dir, of ruim 'm op."
+  [ -e "$KLONKT_DIR" ] && [ -n "$(ls -A "$KLONKT_DIR" 2>/dev/null)" ] && die "$KLONKT_DIR already exists and is not a git checkout. Pick --dir, or clean it up."
   mkdir -p "$KLONKT_DIR"
   git clone --depth 1 --branch "$KLONKT_BRANCH" "$KLONKT_REPO" "$KLONKT_DIR"
@@ -149,5 +149,5 @@
 ok "code in $KLONKT_DIR"
 
-log "Dependencies installeren (npm ci)…"
+log "Installing dependencies (npm ci)…"
 as_klonkt bash -c "cd '$KLONKT_DIR' && npm ci --omit=dev"
 ok "node_modules"
@@ -168,12 +168,12 @@
   } > "$ENV"
   chown "$KLONKT_USER:$KLONKT_USER" "$ENV"; chmod 600 "$ENV"
-  ok "nieuwe .env (willekeurige SESSION_SECRET)"
-else
-  # poort in bestaande .env synchroniseren met de gekozen poort
+  ok "new .env (random SESSION_SECRET)"
+else
+  # sync the port in an existing .env with the chosen port
   if grep -q '^PORT=' "$ENV"; then sed -i "s/^PORT=.*/PORT=${KLONKT_PORT}/" "$ENV"; fi
-  ok "bestaande .env behouden (poort gesynchroniseerd)"
-fi
-
-log "systemd-service…"
+  ok "kept existing .env (port synced)"
+fi
+
+log "systemd service…"
 NODE_BIN="$(command -v node)"
 cat > /etc/systemd/system/klonkt.service <<EOF
@@ -200,8 +200,8 @@
 systemctl daemon-reload
 systemctl enable --now klonkt
-ok "klonkt.service draait op 127.0.0.1:${KLONKT_PORT}"
+ok "klonkt.service running on 127.0.0.1:${KLONKT_PORT}"
 
 if [ -z "$NO_CADDY" ]; then
-  log "Caddy-config voor ${KLONKT_DOMAIN}…"
+  log "Caddy config for ${KLONKT_DOMAIN}…"
   CADDY=/etc/caddy/Caddyfile
   SITE_BLOCK="${KLONKT_DOMAIN} {
@@ -216,10 +216,10 @@
     printf '\n%s\n' "$SITE_BLOCK" >> "$CADDY"
   fi
-  caddy validate --config "$CADDY" --adapter caddyfile >/dev/null 2>&1 || die "Caddy-config ongeldig — controleer $CADDY"
+  caddy validate --config "$CADDY" --adapter caddyfile >/dev/null 2>&1 || die "Caddy config invalid — check $CADDY"
   systemctl reload caddy 2>/dev/null || systemctl restart caddy
-  ok "caddy serveert ${KLONKT_DOMAIN}"
-fi
-
-log "Update-commando 'klonkt-update'…"
+  ok "caddy serving ${KLONKT_DOMAIN}"
+fi
+
+log "Update command 'klonkt-update'…"
 cat > /usr/local/bin/klonkt-update <<EOF
 #!/usr/bin/env bash
@@ -234,5 +234,5 @@
 fi
 systemctl restart klonkt
-echo "Klonkt bijgewerkt (\$A) + herstart."
+echo "Klonkt updated (\$A) + restarted."
 EOF
 chmod +x /usr/local/bin/klonkt-update
@@ -241,24 +241,24 @@
 echo
 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
-echo "  Klonkt draait! 🎉"
+echo "  Klonkt is running! 🎉"
 echo
 if [ -n "$NO_CADDY" ]; then
-  echo "  Klonkt luistert op:  http://127.0.0.1:${KLONKT_PORT}"
+  echo "  Klonkt listens on:  http://127.0.0.1:${KLONKT_PORT}"
   if [ "$FOREIGN_PROXY" = 1 ]; then
-    echo "  Er draait al een webserver op 80/443 — zet Klonkt erachter."
-  fi
-  echo "  Voorbeeld nginx:"
+    echo "  A webserver is already running on 80/443 — put Klonkt behind it."
+  fi
+  echo "  Example nginx:"
   echo "      location / { proxy_pass http://127.0.0.1:${KLONKT_PORT}; proxy_set_header Host \$host;"
   echo "                   proxy_set_header X-Forwarded-Proto \$scheme; }"
-  echo "  Voorbeeld Caddy:"
+  echo "  Example Caddy:"
   echo "      ${KLONKT_DOMAIN} { reverse_proxy 127.0.0.1:${KLONKT_PORT} }"
 else
-  echo "  • Open je site:   https://${KLONKT_DOMAIN}"
-fi
-echo "  • Eerste keer:    ga naar /auth/register en maak je beheerdersaccount aan."
-echo
-echo "  Beheer:  systemctl status klonkt · journalctl -u klonkt -f · klonkt-update"
-echo "  Wachtwoord kwijt: cd ${KLONKT_DIR} && runuser -u ${KLONKT_USER} -- env HOME=${KLONKT_DIR} npm run reset-admin"
-echo
-echo "  DNS: zorg dat A + AAAA van ${KLONKT_DOMAIN} naar deze server wijzen."
+  echo "  • Open your site:  https://${KLONKT_DOMAIN}"
+fi
+echo "  • First run:       go to /auth/register and create your admin account."
+echo
+echo "  Manage:  systemctl status klonkt · journalctl -u klonkt -f · klonkt-update"
+echo "  Lost password: cd ${KLONKT_DIR} && runuser -u ${KLONKT_USER} -- env HOME=${KLONKT_DIR} npm run reset-admin"
+echo
+echo "  DNS: make sure A + AAAA of ${KLONKT_DOMAIN} point to this server."
 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
