#!/usr/bin/env bash # # CleanClip - one-command installer # # curl -fsSL https://is.gd/cleanclip | bash # # Installs Hammerspoon (if needed), drops in CleanClip, locks the Hammerspoon # preferences to a clean background setup, and launches it. Works with no # developer tools installed (downloads Hammerspoon straight from GitHub). set -euo pipefail GIST_RAW="https://gist.githubusercontent.com/spbavarva/d6e29e12d3fc8572b62c8523ffccc2a6/raw" LUA_NAME="cleanclip.lua" HS_DIR="$HOME/.hammerspoon" APP_DIR="$HS_DIR/cleanclip" HS_PREF="org.hammerspoon.Hammerspoon" ask() { # prompts work even under `curl ... | bash`; no terminal => assume yes local prompt="$1" reply="" { read -r -p "$prompt" reply /dev/null || reply="" echo "$reply" } say() { printf '\033[1;36m▸ %s\033[0m\n' "$1"; } ok() { printf '\033[1;32m✓ %s\033[0m\n' "$1"; } warn() { printf '\033[1;33m! %s\033[0m\n' "$1"; } [ "$(uname)" = "Darwin" ] || { warn "macOS only. Aborting."; exit 1; } echo say "CleanClip installer" echo " Auto-cleans Claude Code copies + adds a clipboard-history popup (tap" echo " left ⌥ + left ⌘). Installs Hammerspoon if you don't already have it." echo case "$(ask 'Continue? [Y/n] ')" in [nN]*) echo "Cancelled."; exit 0 ;; esac # --- 1. Hammerspoon --------------------------------------------------------- if [ -d "/Applications/Hammerspoon.app" ]; then ok "Hammerspoon already installed." elif command -v brew >/dev/null 2>&1; then say "Installing Hammerspoon via Homebrew..."; brew install --cask hammerspoon; ok "Installed." else say "Downloading Hammerspoon from GitHub (no Homebrew needed)..." tmp="$(mktemp -d)"; trap 'rm -rf "$tmp"' EXIT url="$(curl -fsSL https://api.github.com/repos/Hammerspoon/hammerspoon/releases/latest \ | grep 'browser_download_url' | grep '\.zip' | head -1 | cut -d'"' -f4)" [ -n "$url" ] || { warn "Could not find Hammerspoon download URL."; exit 1; } curl -fsSL -o "$tmp/hs.zip" "$url" unzip -q "$tmp/hs.zip" -d "$tmp" if [ -w /Applications ]; then mv "$tmp/Hammerspoon.app" /Applications/ else warn "Need your password to move Hammerspoon into /Applications."; sudo mv "$tmp/Hammerspoon.app" /Applications/; fi ok "Installed." fi # --- 2. CleanClip script ---------------------------------------------------- say "Installing CleanClip..." mkdir -p "$APP_DIR" curl -fsSL -o "$APP_DIR/$LUA_NAME" "$GIST_RAW/$LUA_NAME" ok "Saved to $APP_DIR/$LUA_NAME" # --- 3. Wire up init.lua (idempotent; strips any older version) ------------- touch "$HS_DIR/init.lua" clean_init="$(grep -v -e 'CleanClip managed block' -e 'cleanclip' \ -e 'claude-clipboard-cleaner' -e 'Claude Clipboard Cleaner' \ "$HS_DIR/init.lua" 2>/dev/null || true)" printf '%s\n' "$clean_init" > "$HS_DIR/init.lua" { printf '\n-- CleanClip managed block (auto-generated by installer)\n' printf 'dofile("%s/%s")\n' "$APP_DIR" "$LUA_NAME" } >> "$HS_DIR/init.lua" ok "Hammerspoon config wired up." # --- 4. Lock Hammerspoon preferences ---------------------------------------- # Launch-at-login, dock/menu icon, console-on-top are enforced by cleanclip.lua # on load. Here we set the ones with no Lua API: defaults write "$HS_PREF" HSUploadCrashData -bool false 2>/dev/null || true # crash data OFF defaults write "$HS_PREF" SUEnableAutomaticChecks -bool true 2>/dev/null || true # updates ON defaults write "$HS_PREF" "cleanclip.menuBarVisible" -bool true 2>/dev/null || true # show icon defaults write "$HS_PREF" "cleanclip.welcomed" -bool false 2>/dev/null || true # show welcome card ok "Preferences set (crash reporting off, updates on, menu icon on)." # --- 5. Launch / reload ----------------------------------------------------- say "Launching Hammerspoon..." osascript -e 'tell application "Hammerspoon" to quit' >/dev/null 2>&1 || true sleep 1 open -a Hammerspoon # --- 6. Accessibility (required for the clipboard shortcut) ------------------ echo ok "Installed!" echo warn "One manual step — the ⌥⌘ clipboard popup needs Accessibility permission:" echo " Allow 'Hammerspoon' under System Settings → Privacy & Security → Accessibility." echo " Opening that page for you now..." open "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility" >/dev/null 2>&1 || true echo echo "Then: copies auto-clean, and tapping left ⌥ + left ⌘ opens your clipboard history. 🎉" echo "(A styled welcome card will appear once Hammerspoon finishes loading.)"