diff --git a/Brewfile b/Brewfile
index 0fe589e..9ce9c22 100644
--- a/Brewfile
+++ b/Brewfile
@@ -1,5 +1,5 @@
-# Brewfile - Curated list for fresh macOS setup
-# Comment out lines for apps you don't want installed
+# Brewfile - Optimized for CapableMind development, research, and ARC publishing
+# Last updated: 2026-03-20
# Taps
tap "homebrew/cask"
@@ -10,16 +10,13 @@ tap "homebrew/cask-fonts"
# ============================================
brew "antidote" # ZSH plugin manager
brew "powerlevel10k" # ZSH theme
-brew "fzf" # Fuzzy finder
-brew "zoxide" # Smarter cd command
-brew "direnv" # Per-directory environment variables
-brew "tmux" # Terminal multiplexer
# ============================================
# ESSENTIAL CLI TOOLS
# ============================================
brew "mas" # Mac App Store CLI
brew "git" # Version control
+brew "git-lfs" # Git large file storage
brew "wget" # Download files
brew "tree" # Directory visualization
brew "coreutils" # GNU core utilities
@@ -28,58 +25,55 @@ brew "jq" # JSON processor
brew "ripgrep" # Fast grep alternative (rg)
brew "fd" # Fast find alternative
brew "bat" # Better cat with syntax highlighting
-brew "tldr" # Simplified man pages
-brew "httpie" # Modern curl alternative
+brew "tealdeer" # Simplified man pages (tldr)
# ============================================
-# DEVELOPMENT TOOLS
+# DEVELOPMENT
# ============================================
-# brew "node" # Node.js (you use nvm instead)
-brew "python@3.12" # Python (for proselint dependency)
-brew "python@3.13" # Python (latest)
-brew "pipx" # Install Python apps in isolated envs
+# Node.js managed via nvm, not Homebrew
+brew "python@3.13" # Python
brew "pandoc" # Document converter
brew "multimarkdown" # Enhanced markdown processor
brew "gh" # GitHub CLI
-brew "proselint" # Prose linter
+# Future: custom AldineXXI prose linter (replaces proselint)
-# Text editors & IDEs
-cask "iterm2" # Terminal emulator
+# ============================================
+# CAPABLEMIND / AI
+# ============================================
+cask "ollama" # Local LLMs + embedding models
+brew "gnupg" # GPG encryption (dependency for pass)
+brew "pass" # Password store
+
+# ============================================
+# TERMINAL & EDITORS
+# ============================================
cask "kitty" # GPU-accelerated terminal
cask "bbedit" # Text editor
-# Version control
-cask "github" # GitHub Desktop
-
# ============================================
-# PRODUCTIVITY & ESSENTIAL APPS
+# PRODUCTIVITY
# ============================================
-cask "1password" # Password manager
cask "obsidian" # Knowledge base
cask "marked" # Markdown preview (Marked 2)
cask "launchbar" # Application launcher
-
-# Communication
cask "signal" # Encrypted messaging
-# cask "telegram" # Messaging
# ============================================
# UTILITIES
# ============================================
cask "karabiner-elements" # Keyboard customization
-cask "hazel" # Automated organization
cask "keka" # Archive utility
-cask "appcleaner" # Uninstall apps cleanly
+cask "appcleaner" # Uninstall apps cleanly (no background daemon)
cask "bartender" # Menu bar organization
-cask "swiftbar" # Menu bar scripts
cask "soundsource" # Audio control
+cask "caffeine" # Prevent sleep
cask "vuescan" # Scanner software
# ============================================
-# MEDIA & CREATIVE
+# MEDIA
# ============================================
brew "ffmpeg" # Media processing
-brew "yt-dlp" # YouTube downloader (active fork)
+brew "yt-dlp" # YouTube downloader
brew "exiftool" # Read/write EXIF metadata
cask "vlc" # Media player
cask "handbrake" # Video transcoder
@@ -87,87 +81,62 @@ cask "xld" # Audio converter
cask "transmission" # BitTorrent client
# ============================================
-# OPTIONAL/SPECIFIC USE
+# SECURITY & TRANSFER
# ============================================
-# Research & Reading
-cask "calibre" # E-book management
-# cask "zotero" # Reference management
-# cask "anki" # Spaced repetition
-
-# Development & Transfer
-# cask "docker" # Containerization
+cask "gpg-suite" # GPG keychain and tools
cask "transmit" # FTP/SFTP client
-# Security/Privacy
-# cask "tunnelblick" # OpenVPN client
-cask "gpg-suite" # GPG encryption
-# cask "lulu" # Firewall
-cask "oversight" # Webcam/mic monitor
-
-# Other tools
-brew "neofetch" # System info display
+# ============================================
+# OTHER TOOLS
+# ============================================
+brew "fastfetch" # System info display (replaced neofetch)
brew "qrencode" # Generate QR codes
+brew "ocrmypdf" # OCR for PDFs
+brew "tesseract" # OCR engine (ocrmypdf dependency)
brew "mackup" # Backup/sync app preferences
-brew "pass" # Password store (for GPG)
-cask "ollama" # Local LLMs
+brew "tea" # Gitea CLI
+brew "sshpass" # SSH password automation (clasp access)
+brew "vitetris" # Tetris
# ============================================
# FONTS
# ============================================
-cask "font-hack-nerd-font" # Programming font with icons
-# cask "font-fira-code-nerd-font" # Ligatures + icons
-# cask "font-jetbrains-mono-nerd-font" # JetBrains + icons
-# cask "font-meslo-lg-nerd-font" # Powerline + icons
-# cask "font-source-code-pro-nerd-font" # Adobe Source Code Pro + icons
+cask "font-hack-nerd-font" # Programming font with icons (powerlevel10k)
# ============================================
-# MAC APP STORE APPS
+# MAC APP STORE
# ============================================
# Productivity
mas "Drafts", id: 1435957248
mas "iA Writer", id: 775737590
-mas "Numbers", id: 409203825
-mas "Pages", id: 409201541
mas "PCalc", id: 403504866
-# Communication
-mas "WhatsApp", id: 1147396723
-
# Safari Extensions
-mas "1Password for Safari", id: 1569813296
-mas "AdGuard for Safari", id: 1440147259
+mas "Kagi Search", id: 1622835804
+mas "Dark Reader for Safari", id: 1438243180
mas "Hush", id: 1544743900
mas "Vinegar", id: 1591303229
mas "StopTheMadness Pro", id: 6471380298
mas "Super Agent", id: 1568262835
# Reading & Research
-mas "Reeder.", id: 1529448980
mas "Klib", id: 1196268448
mas "forScore", id: 363738376
+mas "Obsidian Web Clipper", id: 6720708363
# Utilities
mas "LocalSend", id: 1661733229
mas "NordVPN", id: 905953485
mas "Table Tool", id: 1122008420
mas "xSearch", id: 1579902068
-mas "Exporter", id: 1099120373
mas "Mapper", id: 1589391989
-mas "Moon Pro", id: 1528941870
# Privacy/Security
mas "Orbot", id: 1609461599
-# Optional (commented out)
-# mas "Fantastical", id: 975937182
-# mas "Keynote", id: 409183694
-# mas "Dark Reader for Safari", id: 1438243180
-
# ============================================
# APPS TO INSTALL MANUALLY
# ============================================
# These don't have casks or require special handling:
-# - Claude
-# - ChatGPT
-# - Dorico 5 (Steinberg)
-# - Some audio production apps
\ No newline at end of file
+# - Claude (Anthropic)
+# - Dorico 5 (Steinberg — music engraving)
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..0e1e8b3
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,94 @@
+# CLAUDE.md — Global
+
+## Prime Directive
+
+> _Do things once, correctly, with lasting integrity._
+> _Choose what is proportionate, fitting, and durable._
+> _Build what you will not need to rebuild._
+
+> **μέτρον γὰρ καὶ συμμετρία καὶ τὸ πρόσφορον πανταχοῦ καλόν τε καὶ ἀγαθόν παρέχει**
+> "Measure, proportion, and what is fitting give rise to beauty and goodness everywhere."
+
+This is the decision filter for all work. When choosing between approaches: favor durability over expedience, clarity over cleverness, fittingness over uniformity. Every commit should leave the system inhabitable — not dependent on the next step to be meaningful.
+
+---
+
+## Identity & Context
+
+- **David Glidden**: principal violist (Le Concert des Nations / Jordi Savall; Les Musiciens du Louvre / Marc Minkowski), based in Barcelona
+- Languages: English (native), French (near-native), Spanish, Catalan
+- Founder of **Animal Rationis Capax (ARC)** — a public writing and publishing platform
+- Co-founder and principal architect of **CapableMind** — ethically governed AI systems (L1 memory / L2 constitutional governance)
+- Father of Lune and Kai. Fatherhood and intergenerational stewardship are central to all domains of work
+
+---
+
+## Collaboration Model
+
+Claude operates as **deliberative partner**, not execution engine. This means:
+
+### Governed Initiative
+- **Propose** paths, tools, approaches, and alternatives — do not wait to be asked
+- **Flag** tensions, risks, drift, and architectural consequences of choices
+- **Surface** findings for human authorization before they become action
+- **Hold** open questions as open questions — do not resolve prematurely
+- The boundary: initiative surfaces as *proposal*; only the human converts proposal to *action*
+
+### Epistemic Discipline
+- Make assumptions visible. State confidence and scope explicitly
+- Distinguish between exploration, proposal, and settled decision
+- When uncertain, say what is uncertain and why
+- Resist premature closure — premature synthesis is a failure mode, not efficiency
+- If a maxim or principle becomes decorative rather than load-bearing, flag it
+
+### Communication
+- Begin concise; deepen with structure when warranted
+- No flattery, motivational padding, or false reassurance
+- Preserve necessary ambiguity — do not false-clarify
+- Ask clarifying questions only when they materially improve rigor
+
+---
+
+## Working Discipline
+
+### Context Rot Prevention
+- **One canonical source of truth** per document. No parallel versions
+- **No silent edits** — log what changed and why
+- **Integrity links** — when modifying documents, maintain or update cross-references
+- **Review cadence** — flag documents that have drifted from their stated review dates
+
+### Session Discipline
+- Prefer durable architecture over clever solutions
+- When multiple approaches exist, name them with tradeoffs before proceeding
+- If a task would benefit from a tool, library, or approach not yet discussed, say so
+- Front-load critical context; avoid redundant re-establishment across sessions
+- If session state is growing large, flag it early rather than losing coherence silently
+
+### Non-Convergence Principle
+- The system should be inhabitable, dignified, and sufficient at any point along the way
+- No step should create a dependency on a future step to be meaningful
+- Each unit of work should be complete in itself
+
+---
+
+## Decision Heuristics
+
+When evaluating a choice, apply in order:
+
+1. **Fittingness** (τὸ πρόσφορον) — Is this proportionate to circumstance, season, energy, and context?
+2. **Durability** — Will this hold under pressure, or does it create hidden costs?
+3. **Inheritability** — Could someone else (collaborator, future self, Lune, Kai) follow this thread without confusion?
+4. **Correction posture** — If this turns out wrong, how easily can it be corrected? Prefer reversible choices
+
+---
+
+## Active Projects
+
+| Project | Path | Notes |
+|---------|------|-------|
+| **CapableMind L1/L2** | `~/_Dev/CapableMind-AI` | Constitutional governance system. Read local CLAUDE.md for build state |
+| **Animal Rationis Capax** | `~/_Dev/animal-davidglidden-eu` | Hakyll publishing system. Read local CLAUDE.md for technical context |
+| **Compass** | `'/Users/davidglidden/Library/Mobile Documents/iCloud~md~obsidian/Documents/David, root-and-branch/00. Compass'` | Personal operating system (Obsidian vault). Read-only reference |
+| **Dotfiles** | `~/dotfiles` | Dotfiles for easy restore and setup |
+
+When navigating into a project directory, always read its local CLAUDE.md first for current state, build sequences, and terminology.
\ No newline at end of file
diff --git a/bin/bmf-start.sh b/bin/bmf-start.sh
new file mode 100755
index 0000000..8a690e9
--- /dev/null
+++ b/bin/bmf-start.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+# BMF (BetterMemories) launch script for launchd
+# Pulls ANTHROPIC_API_KEY from macOS keychain, starts BMF with teacher in API mode.
+
+set -euo pipefail
+
+export HOME="/Users/davidglidden"
+export PATH="/Users/davidglidden/.nvm/versions/node/v22.16.0/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
+
+# Pull API key from env file
+set -a
+source /Users/davidglidden/.capablemind/env
+set +a
+
+# BMF config
+export BM_PORT="3011"
+export BM_TEACHER_TRANSPORT="api"
+export BMF_MCP_TOKEN="bm_key_REDACTED"
+
+# Ollama needs to be reachable
+export OLLAMA_HOST="${OLLAMA_HOST:-http://127.0.0.1:11434}"
+
+cd /Users/davidglidden/_Dev/BetterMemories.io
+exec node dist/index.js
diff --git a/bin/capablemind-thinking-mirror.sh b/bin/capablemind-thinking-mirror.sh
new file mode 100755
index 0000000..acc9711
--- /dev/null
+++ b/bin/capablemind-thinking-mirror.sh
@@ -0,0 +1,8 @@
+#!/bin/zsh
+# Mirror CapableMind thinking/David/ to Obsidian vault
+# Excludes CLAUDE.md (repo-specific, not for vault)
+
+SOURCE="$HOME/_Dev/CapableMind-AI/docs/thinking/David/"
+DEST="$HOME/Library/Mobile Documents/iCloud~md~obsidian/Documents/David, root-and-branch/00. Compass/00b. Constellations/CapableMind/thinking-mirror/"
+
+rsync -av --delete --exclude='CLAUDE.md' "$SOURCE" "$DEST" > /dev/null 2>&1
diff --git a/bin/obsidian_rsync_excludes.txt b/bin/obsidian_rsync_excludes.txt
new file mode 100644
index 0000000..eaa0256
--- /dev/null
+++ b/bin/obsidian_rsync_excludes.txt
@@ -0,0 +1,14 @@
+# Git internals (never mirror a .git from anywhere)
+.git/
+# OS cruft
+.DS_Store
+Thumbs.db
+# Obsidian volatile state
+.obsidian/workspace.json
+.obsidian/workspace-mobile.json
+.obsidian/plugins/obsidian-git/data.json
+.obsidian/cache/
+# Optional: ignore huge/unneeded subtrees on the mirror
+# attachments/raw_video/
+# attachments/raw_audio/
+# node_modules/ # if you keep code inside the vault
\ No newline at end of file
diff --git a/bin/obsidian_vault_sync.sh b/bin/obsidian_vault_sync.sh
new file mode 100755
index 0000000..d49df9d
--- /dev/null
+++ b/bin/obsidian_vault_sync.sh
@@ -0,0 +1,92 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+########################################
+# CONFIG — EDIT THESE 4 LINES
+########################################
+VAULT_PATH="/Users/davidglidden/Library/Mobile Documents/iCloud~md~obsidian/Documents/David, root-and-branch"
+MIRROR_PATH="/Users/davidglidden/_Dev/david-root-and-branch-vault-git"
+GIT_REMOTE="https://git.skemantix.com/David/david-root-and-branch-vault-git.git"
+GIT_BRANCH="main"
+
+# Optional: set your git identity here (comment out if already global)
+# GIT_NAME="David Glidden"
+# GIT_EMAIL="you@example.com"
+
+# Excludes file lives alongside this script
+EXCLUDES_FILE="$(dirname "$0")/obsidian_rsync_excludes.txt"
+LOG_FILE="${HOME}/Library/Logs/vaultsync.log"
+########################################
+
+timestamp() { date "+%Y-%m-%d %H:%M:%S"; }
+log() { printf "[%s] %s\n" "$(timestamp)" "$*" | tee -a "$LOG_FILE"; }
+
+ensure_paths() {
+ mkdir -p "$(dirname "$LOG_FILE")"
+ mkdir -p "$MIRROR_PATH"
+}
+
+# Guard: skip if iCloud still downloading placeholders (*.icloud)
+icloud_busy() {
+ # Any placeholder files inside vault?
+ # NOTE: adjust -prune if you want to skip very large folders from scanning
+ if find "$VAULT_PATH" -type f -name "*.icloud" -print -quit | grep -q . ; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+init_git_repo() {
+ if [ ! -d "$MIRROR_PATH/.git" ]; then
+ log "Initializing git repo in $MIRROR_PATH"
+ git init "$MIRROR_PATH"
+ git -C "$MIRROR_PATH" checkout -b "$GIT_BRANCH" || true
+ git -C "$MIRROR_PATH" remote add origin "$GIT_REMOTE" || true
+ git -C "$MIRROR_PATH" config user.name "$GIT_NAME" || true
+ git -C "$MIRROR_PATH" config user.email "$GIT_EMAIL" || true
+ fi
+}
+
+do_rsync() {
+ log "Syncing from iCloud vault → mirror"
+ rsync -av --delete \
+ --exclude-from="$EXCLUDES_FILE" \
+ "$VAULT_PATH"/ "$MIRROR_PATH"/ | tee -a "$LOG_FILE"
+}
+
+do_commit_push() {
+ log "Checking for changes to commit"
+ if ! git -C "$MIRROR_PATH" diff --quiet || \
+ ! git -C "$MIRROR_PATH" diff --cached --quiet || \
+ [ -n "$(git -C "$MIRROR_PATH" ls-files --others --exclude-standard)" ]; then
+ git -C "$MIRROR_PATH" add -A
+ git -C "$MIRROR_PATH" commit -m "Mirror sync $(date +%Y-%m-%d_%H-%M-%S)" --no-verify
+ log "Committed changes"
+ # Push; if first push, set upstream
+ if git -C "$MIRROR_PATH" rev-parse --verify "$GIT_BRANCH" >/dev/null 2>&1; then
+ git -C "$MIRROR_PATH" push origin "$GIT_BRANCH" || log "Push failed (network?). Will retry next run."
+ else
+ git -C "$MIRROR_PATH" push -u origin "$GIT_BRANCH" || log "First push failed. Check remote."
+ fi
+ else
+ log "No changes to commit"
+ fi
+}
+
+main() {
+ ensure_paths
+
+ if icloud_busy; then
+ log "iCloud still downloading placeholders (*.icloud). Skipping this run."
+ exit 0
+ fi
+
+ init_git_repo
+ do_rsync
+ do_commit_push
+
+ log "Done."
+}
+
+main "$@"
\ No newline at end of file
diff --git a/config/capablemind/com.capablemind.bettermemories.plist b/config/capablemind/com.capablemind.bettermemories.plist
new file mode 100644
index 0000000..9b3ba14
--- /dev/null
+++ b/config/capablemind/com.capablemind.bettermemories.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ Label
+ com.capablemind.bettermemories
+
+ ProgramArguments
+
+ /Users/davidglidden/.nvm/versions/node/v22.16.0/bin/node
+ /Users/davidglidden/_Dev/BetterMemories.io/dist/index.js
+
+
+ WorkingDirectory
+ /Users/davidglidden/_Dev/BetterMemories.io
+
+ RunAtLoad
+
+
+ KeepAlive
+
+ SuccessfulExit
+
+
+
+ ThrottleInterval
+ 10
+
+ StandardOutPath
+ /Users/davidglidden/.capablemind/logs/bmf.stdout.log
+
+ StandardErrorPath
+ /Users/davidglidden/.capablemind/logs/bmf.stderr.log
+
+ EnvironmentVariables
+
+ BM_PORT
+ 3011
+ BM_DEPLOYMENT_MODEL
+ standalone
+ BMF_MCP_TOKEN
+ bm_key_7feb421ef8fd45e8
+ PATH
+ /Users/davidglidden/.nvm/versions/node/v22.16.0/bin:/usr/local/bin:/usr/bin:/bin
+
+
+
diff --git a/config/capablemind/com.capablemind.bmf.plist b/config/capablemind/com.capablemind.bmf.plist
new file mode 100644
index 0000000..c30d53b
--- /dev/null
+++ b/config/capablemind/com.capablemind.bmf.plist
@@ -0,0 +1,31 @@
+
+
+
+
+ Label
+ com.capablemind.bmf
+
+ ProgramArguments
+
+ /Users/davidglidden/bin/bmf-start.sh
+
+
+ RunAtLoad
+
+
+ KeepAlive
+
+
+ ThrottleInterval
+ 10
+
+ StandardOutPath
+ /Users/davidglidden/.capablemind/logs/bmf.stdout.log
+
+ StandardErrorPath
+ /Users/davidglidden/.capablemind/logs/bmf.stderr.log
+
+ WorkingDirectory
+ /Users/davidglidden/_Dev/BetterMemories.io
+
+
diff --git a/config/capablemind/com.dglidden.thinking-mirror.plist b/config/capablemind/com.dglidden.thinking-mirror.plist
new file mode 100644
index 0000000..ebd2ba8
--- /dev/null
+++ b/config/capablemind/com.dglidden.thinking-mirror.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ Label
+ com.dglidden.thinking-mirror
+
+ ProgramArguments
+
+ /Users/davidglidden/bin/capablemind-thinking-mirror.sh
+
+
+ StartInterval
+ 172800
+
+ RunAtLoad
+
+
+ StandardOutPath
+ /Users/davidglidden/.capablemind/logs/thinking-mirror.log
+
+ StandardErrorPath
+ /Users/davidglidden/.capablemind/logs/thinking-mirror.log
+
+
diff --git a/config/capablemind/com.dglidden.vaultsync.plist b/config/capablemind/com.dglidden.vaultsync.plist
new file mode 100644
index 0000000..40cda8a
--- /dev/null
+++ b/config/capablemind/com.dglidden.vaultsync.plist
@@ -0,0 +1,29 @@
+
+
+
+
+ Label
+ com.dglidden.vaultsync
+
+ ProgramArguments
+
+ /bin/bash
+ -lc
+ ~/bin/obsidian_vault_sync.sh
+
+
+
+ StartInterval
+ 1800
+
+
+ RunAtLoad
+
+
+ StandardOutPath
+ /Users/davidglidden/Library/Logs/vaultsync.log
+ StandardErrorPath
+ /Users/davidglidden/Library/Logs/vaultsync.log
+
+
\ No newline at end of file
diff --git a/config/capablemind/mcp.json.example b/config/capablemind/mcp.json.example
new file mode 100644
index 0000000..bc91759
--- /dev/null
+++ b/config/capablemind/mcp.json.example
@@ -0,0 +1,17 @@
+{
+ "mcpServers": {
+ "capablemind": {
+ "command": "node",
+ "args": ["/Users/davidglidden/_Dev/BetterMemories.io/dist/index.js"],
+ "cwd": "/Users/davidglidden/_Dev/BetterMemories.io",
+ "env": {
+ "BM_MCP_STDIO": "true",
+ "BM_PORT": "3011",
+ "BM_TEACHER_TRANSPORT": "api",
+ "BMF_MCP_TOKEN": "bm_key_REDACTED",
+ "BM_PYTHON_PATH": "/Users/davidglidden/_Dev/BetterMemories.io/.venv/bin/python3",
+ "BM_MELD_URL": "http://10.0.1.10:3011"
+ }
+ }
+ }
+}
diff --git a/config/iterm2/AppSupport/EnableAI.secureSetting b/config/iterm2/AppSupport/EnableAI.secureSetting
deleted file mode 100644
index cf724b5..0000000
--- a/config/iterm2/AppSupport/EnableAI.secureSetting
+++ /dev/null
@@ -1,2 +0,0 @@
-2f55736572732f6461766964676c696464656e2f4c6962726172792f4170706c69636174696f6e20537570706f72742f695465726d322f456e61626c6541492e73656375726553657474696e67 0975c0e7440a897bbddeb6c6945a2eb9bcdecaaa4840bebc3955dd9a3df359bb
-74727565
\ No newline at end of file
diff --git a/config/iterm2/AppSupport/SavedState/lock b/config/iterm2/AppSupport/SavedState/lock
deleted file mode 100644
index e69de29..0000000
diff --git a/config/iterm2/AppSupport/SavedState/restorable-state.sqlite b/config/iterm2/AppSupport/SavedState/restorable-state.sqlite
deleted file mode 100644
index 27631cf..0000000
Binary files a/config/iterm2/AppSupport/SavedState/restorable-state.sqlite and /dev/null differ
diff --git a/config/iterm2/AppSupport/SavedState/restorable-state.sqlite-shm b/config/iterm2/AppSupport/SavedState/restorable-state.sqlite-shm
deleted file mode 100644
index db610f4..0000000
Binary files a/config/iterm2/AppSupport/SavedState/restorable-state.sqlite-shm and /dev/null differ
diff --git a/config/iterm2/AppSupport/SavedState/restorable-state.sqlite-wal b/config/iterm2/AppSupport/SavedState/restorable-state.sqlite-wal
deleted file mode 100644
index e69de29..0000000
diff --git a/config/iterm2/AppSupport/iTermServer-3.5.14 b/config/iterm2/AppSupport/iTermServer-3.5.14
deleted file mode 100755
index bd7bfd2..0000000
Binary files a/config/iterm2/AppSupport/iTermServer-3.5.14 and /dev/null differ
diff --git a/config/iterm2/AppSupport/iterm2-daemon-1.socket.lock b/config/iterm2/AppSupport/iterm2-daemon-1.socket.lock
deleted file mode 100644
index e69de29..0000000
diff --git a/config/iterm2/AppSupport/parsers/014e9c043e021d5c898148c90e74b61993eb25116b8144c57afaeb4f26359815 b/config/iterm2/AppSupport/parsers/014e9c043e021d5c898148c90e74b61993eb25116b8144c57afaeb4f26359815
deleted file mode 100644
index 03bbc77..0000000
Binary files a/config/iterm2/AppSupport/parsers/014e9c043e021d5c898148c90e74b61993eb25116b8144c57afaeb4f26359815 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/07be5fb0dae8eff07a6a3d7f3170589a5511b22b3df67db7eb602851a6d4dafa b/config/iterm2/AppSupport/parsers/07be5fb0dae8eff07a6a3d7f3170589a5511b22b3df67db7eb602851a6d4dafa
deleted file mode 100644
index 99c1c35..0000000
Binary files a/config/iterm2/AppSupport/parsers/07be5fb0dae8eff07a6a3d7f3170589a5511b22b3df67db7eb602851a6d4dafa and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/0a5568070904574c8beaf43792a98b70d7b287ffd2d87489fb72ada8d1a01147 b/config/iterm2/AppSupport/parsers/0a5568070904574c8beaf43792a98b70d7b287ffd2d87489fb72ada8d1a01147
deleted file mode 100644
index efcc26a..0000000
Binary files a/config/iterm2/AppSupport/parsers/0a5568070904574c8beaf43792a98b70d7b287ffd2d87489fb72ada8d1a01147 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/19ff3c2e7a97b408f37ac456efb08d4542893275128f260856207e10c80b25d3 b/config/iterm2/AppSupport/parsers/19ff3c2e7a97b408f37ac456efb08d4542893275128f260856207e10c80b25d3
deleted file mode 100644
index a9d40b9..0000000
Binary files a/config/iterm2/AppSupport/parsers/19ff3c2e7a97b408f37ac456efb08d4542893275128f260856207e10c80b25d3 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/237441b77ca9b490648eedd31753c856a747c7afeb3d109c380ded7b6b1bba5f b/config/iterm2/AppSupport/parsers/237441b77ca9b490648eedd31753c856a747c7afeb3d109c380ded7b6b1bba5f
deleted file mode 100644
index 7945ef5..0000000
Binary files a/config/iterm2/AppSupport/parsers/237441b77ca9b490648eedd31753c856a747c7afeb3d109c380ded7b6b1bba5f and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/275f6caa716172d04be44ede5c56bbd0491be254fe259e8720ac7f66f84e0692 b/config/iterm2/AppSupport/parsers/275f6caa716172d04be44ede5c56bbd0491be254fe259e8720ac7f66f84e0692
deleted file mode 100644
index 039ce14..0000000
Binary files a/config/iterm2/AppSupport/parsers/275f6caa716172d04be44ede5c56bbd0491be254fe259e8720ac7f66f84e0692 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/3bdd5312078fc9bbc979fbef6d64db3117afa4662ac9fb849e34dbb206e611b3 b/config/iterm2/AppSupport/parsers/3bdd5312078fc9bbc979fbef6d64db3117afa4662ac9fb849e34dbb206e611b3
deleted file mode 100644
index e463dba..0000000
Binary files a/config/iterm2/AppSupport/parsers/3bdd5312078fc9bbc979fbef6d64db3117afa4662ac9fb849e34dbb206e611b3 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/3cd7b0d690b668dc409a5d602a65db327690b81a92d67cdec5ab0d86a78582b7 b/config/iterm2/AppSupport/parsers/3cd7b0d690b668dc409a5d602a65db327690b81a92d67cdec5ab0d86a78582b7
deleted file mode 100644
index fde4981..0000000
Binary files a/config/iterm2/AppSupport/parsers/3cd7b0d690b668dc409a5d602a65db327690b81a92d67cdec5ab0d86a78582b7 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/47968eaa6beb856315113397c1b1c7848b7127dcd7bddb6df5380f941f8632d5 b/config/iterm2/AppSupport/parsers/47968eaa6beb856315113397c1b1c7848b7127dcd7bddb6df5380f941f8632d5
deleted file mode 100644
index efd919f..0000000
Binary files a/config/iterm2/AppSupport/parsers/47968eaa6beb856315113397c1b1c7848b7127dcd7bddb6df5380f941f8632d5 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/5476e093fc2851a959a742e33c335100d6b78d6513c64f8a13b7ecafb651c3ac b/config/iterm2/AppSupport/parsers/5476e093fc2851a959a742e33c335100d6b78d6513c64f8a13b7ecafb651c3ac
deleted file mode 100644
index e053277..0000000
Binary files a/config/iterm2/AppSupport/parsers/5476e093fc2851a959a742e33c335100d6b78d6513c64f8a13b7ecafb651c3ac and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/5e4e4fa0d96df576b939ee5587c50528f2dc395e4757b970f8b332aa4761f916 b/config/iterm2/AppSupport/parsers/5e4e4fa0d96df576b939ee5587c50528f2dc395e4757b970f8b332aa4761f916
deleted file mode 100644
index 1c96e40..0000000
Binary files a/config/iterm2/AppSupport/parsers/5e4e4fa0d96df576b939ee5587c50528f2dc395e4757b970f8b332aa4761f916 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/5ffd35febcfef2535ed536437d27ee3b19f0f52b885ce20070f7a4bfae82dd9e b/config/iterm2/AppSupport/parsers/5ffd35febcfef2535ed536437d27ee3b19f0f52b885ce20070f7a4bfae82dd9e
deleted file mode 100644
index 4ef870f..0000000
Binary files a/config/iterm2/AppSupport/parsers/5ffd35febcfef2535ed536437d27ee3b19f0f52b885ce20070f7a4bfae82dd9e and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/73aa6138edf938dbc34e1e7d868ceb0fb467dfd23631d63232b235913bfc1d60 b/config/iterm2/AppSupport/parsers/73aa6138edf938dbc34e1e7d868ceb0fb467dfd23631d63232b235913bfc1d60
deleted file mode 100644
index 6d7437a..0000000
Binary files a/config/iterm2/AppSupport/parsers/73aa6138edf938dbc34e1e7d868ceb0fb467dfd23631d63232b235913bfc1d60 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/753940570034705db2b7c35a66c82b4153119b129e3cbfc5a0bd0d05e1bc0976 b/config/iterm2/AppSupport/parsers/753940570034705db2b7c35a66c82b4153119b129e3cbfc5a0bd0d05e1bc0976
deleted file mode 100644
index 9f019c2..0000000
Binary files a/config/iterm2/AppSupport/parsers/753940570034705db2b7c35a66c82b4153119b129e3cbfc5a0bd0d05e1bc0976 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/776fb5db8d99438202acecacb37b7e1ed23be0bb0052a79da5d9495c74440e10 b/config/iterm2/AppSupport/parsers/776fb5db8d99438202acecacb37b7e1ed23be0bb0052a79da5d9495c74440e10
deleted file mode 100644
index a9d40b9..0000000
Binary files a/config/iterm2/AppSupport/parsers/776fb5db8d99438202acecacb37b7e1ed23be0bb0052a79da5d9495c74440e10 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/8564005a2442ab34eb199e2fca2ee16d349b5cce53dc874c7439195a1314e0b9 b/config/iterm2/AppSupport/parsers/8564005a2442ab34eb199e2fca2ee16d349b5cce53dc874c7439195a1314e0b9
deleted file mode 100644
index abe824e..0000000
Binary files a/config/iterm2/AppSupport/parsers/8564005a2442ab34eb199e2fca2ee16d349b5cce53dc874c7439195a1314e0b9 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/85dfcf6f3e327cf4cba1b2c2e0b0e9034c1657b158c125fa4969cb1dfb7fe069 b/config/iterm2/AppSupport/parsers/85dfcf6f3e327cf4cba1b2c2e0b0e9034c1657b158c125fa4969cb1dfb7fe069
deleted file mode 100644
index 0613902..0000000
Binary files a/config/iterm2/AppSupport/parsers/85dfcf6f3e327cf4cba1b2c2e0b0e9034c1657b158c125fa4969cb1dfb7fe069 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/85fbf58977cec86302f08bdce34825c892282a1e4d136f908272283398951a4c b/config/iterm2/AppSupport/parsers/85fbf58977cec86302f08bdce34825c892282a1e4d136f908272283398951a4c
deleted file mode 100644
index 3ef4131..0000000
Binary files a/config/iterm2/AppSupport/parsers/85fbf58977cec86302f08bdce34825c892282a1e4d136f908272283398951a4c and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/9a0055b7fd15226bdc28e4a6b0f3ff113425b8e08b55055ab4e8ed4e9d536f69 b/config/iterm2/AppSupport/parsers/9a0055b7fd15226bdc28e4a6b0f3ff113425b8e08b55055ab4e8ed4e9d536f69
deleted file mode 100644
index c902562..0000000
Binary files a/config/iterm2/AppSupport/parsers/9a0055b7fd15226bdc28e4a6b0f3ff113425b8e08b55055ab4e8ed4e9d536f69 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/a4083865c238cfafe84ea863dee7da51d6a9b4551fa14c2de4eadb18a732882e b/config/iterm2/AppSupport/parsers/a4083865c238cfafe84ea863dee7da51d6a9b4551fa14c2de4eadb18a732882e
deleted file mode 100644
index a9d40b9..0000000
Binary files a/config/iterm2/AppSupport/parsers/a4083865c238cfafe84ea863dee7da51d6a9b4551fa14c2de4eadb18a732882e and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/c9874942c9a010310d15ffe9317bcf195e0150a6ddc9dfb9dc19604e67e0a487 b/config/iterm2/AppSupport/parsers/c9874942c9a010310d15ffe9317bcf195e0150a6ddc9dfb9dc19604e67e0a487
deleted file mode 100644
index fc624cc..0000000
Binary files a/config/iterm2/AppSupport/parsers/c9874942c9a010310d15ffe9317bcf195e0150a6ddc9dfb9dc19604e67e0a487 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/d17946795e97bedb4ba02018ccee43ab135edc04550447bfdaa33bebad7067a0 b/config/iterm2/AppSupport/parsers/d17946795e97bedb4ba02018ccee43ab135edc04550447bfdaa33bebad7067a0
deleted file mode 100644
index 30932cb..0000000
Binary files a/config/iterm2/AppSupport/parsers/d17946795e97bedb4ba02018ccee43ab135edc04550447bfdaa33bebad7067a0 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/d2ba5f33144c8b5daec6ee1f9852db010d1793e88a3e92fe872c6638f10616d0 b/config/iterm2/AppSupport/parsers/d2ba5f33144c8b5daec6ee1f9852db010d1793e88a3e92fe872c6638f10616d0
deleted file mode 100644
index 285bece..0000000
Binary files a/config/iterm2/AppSupport/parsers/d2ba5f33144c8b5daec6ee1f9852db010d1793e88a3e92fe872c6638f10616d0 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/dbb0c454709fad8e69d51af563f5cd64415b91eef8badfce48c1213f2f21e2be b/config/iterm2/AppSupport/parsers/dbb0c454709fad8e69d51af563f5cd64415b91eef8badfce48c1213f2f21e2be
deleted file mode 100644
index 00469be..0000000
Binary files a/config/iterm2/AppSupport/parsers/dbb0c454709fad8e69d51af563f5cd64415b91eef8badfce48c1213f2f21e2be and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/e3f349c138bbb78c81ad36c2d406f4f52aee3ccafe8f27a51cbdfb4050d5e7e0 b/config/iterm2/AppSupport/parsers/e3f349c138bbb78c81ad36c2d406f4f52aee3ccafe8f27a51cbdfb4050d5e7e0
deleted file mode 100644
index ddd4130..0000000
Binary files a/config/iterm2/AppSupport/parsers/e3f349c138bbb78c81ad36c2d406f4f52aee3ccafe8f27a51cbdfb4050d5e7e0 and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/e991cf04e5332b9b56291f4ce431b271836326eb46c838f411fa45be6bb493dc b/config/iterm2/AppSupport/parsers/e991cf04e5332b9b56291f4ce431b271836326eb46c838f411fa45be6bb493dc
deleted file mode 100644
index 817eb9a..0000000
Binary files a/config/iterm2/AppSupport/parsers/e991cf04e5332b9b56291f4ce431b271836326eb46c838f411fa45be6bb493dc and /dev/null differ
diff --git a/config/iterm2/AppSupport/parsers/f0ad1d96a7c6885f10e3d668594b9670a748bd1088be77223828d74578e6e723 b/config/iterm2/AppSupport/parsers/f0ad1d96a7c6885f10e3d668594b9670a748bd1088be77223828d74578e6e723
deleted file mode 100644
index 428bab6..0000000
Binary files a/config/iterm2/AppSupport/parsers/f0ad1d96a7c6885f10e3d668594b9670a748bd1088be77223828d74578e6e723 and /dev/null differ
diff --git a/config/iterm2/AppSupport/version.txt b/config/iterm2/AppSupport/version.txt
deleted file mode 100644
index 4845dc4..0000000
--- a/config/iterm2/AppSupport/version.txt
+++ /dev/null
@@ -1 +0,0 @@
-3.5.14
\ No newline at end of file
diff --git a/config/iterm2/Nord.itermcolors b/config/iterm2/Nord.itermcolors
deleted file mode 100644
index 8ebe33c..0000000
--- a/config/iterm2/Nord.itermcolors
+++ /dev/null
@@ -1,344 +0,0 @@
-
-
-
-
- Ansi 0 Color
-
- Alpha Component
- 1
- Blue Component
- 0.32156863808631897
- Color Space
- sRGB
- Green Component
- 0.25882354378700256
- Red Component
- 0.23137255012989044
-
- Ansi 1 Color
-
- Alpha Component
- 1
- Blue Component
- 0.41568627953529358
- Color Space
- sRGB
- Green Component
- 0.38039216399192810
- Red Component
- 0.74901962280273438
-
- Ansi 10 Color
-
- Alpha Component
- 1
- Blue Component
- 0.54901963472366333
- Color Space
- sRGB
- Green Component
- 0.74509805440902710
- Red Component
- 0.63921570777893066
-
- Ansi 11 Color
-
- Alpha Component
- 1
- Blue Component
- 0.54509806632995605
- Color Space
- sRGB
- Green Component
- 0.79607844352722168
- Red Component
- 0.92156863212585449
-
- Ansi 12 Color
-
- Alpha Component
- 1
- Blue Component
- 0.75686275959014893
- Color Space
- sRGB
- Green Component
- 0.63137257099151611
- Red Component
- 0.50588238239288330
-
- Ansi 13 Color
-
- Alpha Component
- 1
- Blue Component
- 0.67843139171600342
- Color Space
- sRGB
- Green Component
- 0.55686277151107788
- Red Component
- 0.70588237047195435
-
- Ansi 14 Color
-
- Alpha Component
- 1
- Blue Component
- 0.73333334922790527
- Color Space
- sRGB
- Green Component
- 0.73725491762161255
- Red Component
- 0.56078433990478516
-
- Ansi 15 Color
-
- Alpha Component
- 1
- Blue Component
- 0.95686274766921997
- Color Space
- sRGB
- Green Component
- 0.93725490570068359
- Red Component
- 0.92549020051956177
-
- Ansi 2 Color
-
- Alpha Component
- 1
- Blue Component
- 0.54901963472366333
- Color Space
- sRGB
- Green Component
- 0.74509805440902710
- Red Component
- 0.63921570777893066
-
- Ansi 3 Color
-
- Alpha Component
- 1
- Blue Component
- 0.54509806632995605
- Color Space
- sRGB
- Green Component
- 0.79607844352722168
- Red Component
- 0.92156863212585449
-
- Ansi 4 Color
-
- Alpha Component
- 1
- Blue Component
- 0.75686275959014893
- Color Space
- sRGB
- Green Component
- 0.63137257099151611
- Red Component
- 0.50588238239288330
-
- Ansi 5 Color
-
- Alpha Component
- 1
- Blue Component
- 0.67843139171600342
- Color Space
- sRGB
- Green Component
- 0.55686277151107788
- Red Component
- 0.70588237047195435
-
- Ansi 6 Color
-
- Alpha Component
- 1
- Blue Component
- 0.81568628549575806
- Color Space
- sRGB
- Green Component
- 0.75294119119644165
- Red Component
- 0.53333336114883423
-
- Ansi 7 Color
-
- Alpha Component
- 1
- Blue Component
- 0.94117647409439087
- Color Space
- sRGB
- Green Component
- 0.91372549533843994
- Red Component
- 0.89803922176361084
-
- Ansi 8 Color
-
- Alpha Component
- 1
- Blue Component
- 0.41568627953529358
- Color Space
- sRGB
- Green Component
- 0.33725491166114807
- Red Component
- 0.29803922772407532
-
- Ansi 9 Color
-
- Alpha Component
- 1
- Blue Component
- 0.41568627953529358
- Color Space
- sRGB
- Green Component
- 0.38039216399192810
- Red Component
- 0.74901962280273438
-
- Background Color
-
- Alpha Component
- 1
- Blue Component
- 0.25098040699958801
- Color Space
- sRGB
- Green Component
- 0.20392157137393951
- Red Component
- 0.18039216101169586
-
- Badge Color
-
- Alpha Component
- 0.5
- Blue Component
- 0.0
- Color Space
- sRGB
- Green Component
- 0.1491314172744751
- Red Component
- 1
-
- Bold Color
-
- Alpha Component
- 1
- Blue Component
- 0.91372549533843994
- Color Space
- sRGB
- Green Component
- 0.87058824300765991
- Red Component
- 0.84705883264541626
-
- Cursor Color
-
- Alpha Component
- 1
- Blue Component
- 0.91372549533843994
- Color Space
- sRGB
- Green Component
- 0.87058824300765991
- Red Component
- 0.84705883264541626
-
- Cursor Guide Color
-
- Alpha Component
- 0.25
- Blue Component
- 1
- Color Space
- sRGB
- Green Component
- 0.9268307089805603
- Red Component
- 0.70213186740875244
-
- Cursor Text Color
-
- Alpha Component
- 1
- Blue Component
- 0.25098040699958801
- Color Space
- sRGB
- Green Component
- 0.20392157137393951
- Red Component
- 0.18039216101169586
-
- Foreground Color
-
- Alpha Component
- 1
- Blue Component
- 0.91372549533843994
- Color Space
- sRGB
- Green Component
- 0.87058824300765991
- Red Component
- 0.84705883264541626
-
- Link Color
-
- Alpha Component
- 1
- Blue Component
- 0.73423302173614502
- Color Space
- sRGB
- Green Component
- 0.35916060209274292
- Red Component
- 0.0
-
- Selected Text Color
-
- Alpha Component
- 1
- Blue Component
- 0.25098040699958801
- Color Space
- sRGB
- Green Component
- 0.20392157137393951
- Red Component
- 0.18039216101169586
-
- Selection Color
-
- Alpha Component
- 1
- Blue Component
- 0.81568628549575806
- Color Space
- sRGB
- Green Component
- 0.75294119119644165
- Red Component
- 0.53333336114883423
-
-
-
\ No newline at end of file
diff --git a/config/iterm2/README.md b/config/iterm2/README.md
deleted file mode 100644
index c959524..0000000
--- a/config/iterm2/README.md
+++ /dev/null
@@ -1,99 +0,0 @@
-# iTerm2 Configuration
-
-This directory contains iTerm2 configuration to match the Kitty terminal setup with Nord theme.
-
-## Quick Setup
-
-1. **Import Nord Color Scheme**:
- ```bash
- # Run the setup script
- ~/dotfiles/config/iterm2/setup-iterm.sh
- ```
-
-2. **Manual Color Import**:
- - Open iTerm2
- - Press `Cmd+,` to open Preferences
- - Go to **Profiles → Colors**
- - Click **Color Presets...** dropdown
- - Select **Import...**
- - Navigate to `~/dotfiles/config/iterm2/Nord.itermcolors`
- - Select **Nord** from the Color Presets dropdown
-
-## Matching Settings with Kitty
-
-The following settings match your Kitty configuration:
-
-### Font Configuration
-- **Font**: Iosevka Term SS08 (or Dank Mono if you prefer)
-- **Size**: 16pt
-- **Ligatures**: Enabled
-- **Non-ASCII Font**: Fira Code Nerd Font (for symbols)
-
-### Window Settings
-- **Default Size**: 120 columns × 35 rows
-- **Transparency**: 8% (equivalent to Kitty's 0.92 opacity)
-- **Blur**: Optional, helps with readability
-
-### Behavior
-- **Scrollback**: 10,000 lines
-- **Copy on Selection**: Enabled
-- **Visual Bell**: Enabled (no audio bell)
-- **Cursor**: Block, blinking
-
-## Manual Configuration
-
-If you prefer to configure manually:
-
-1. **Font**:
- - Profiles → Text → Font → Change Font
- - Select "Iosevka Term SS08" or "Dank Mono", Size 16
-
-2. **Colors**:
- - Already handled by importing Nord.itermcolors
-
-3. **Window**:
- - Profiles → Window → Settings for New Windows
- - Columns: 120, Rows: 35
- - Transparency: Drag slider to ~8%
-
-4. **Terminal**:
- - Profiles → Terminal → Scrollback Buffer
- - Set to 10,000 lines
-
-5. **Keys**:
- - Profiles → Keys → Key Mappings
- - Add shortcuts as needed to match Kitty
-
-## Keyboard Shortcuts
-
-To match Kitty's shortcuts in iTerm2:
-
-| Action | Kitty | iTerm2 Setup |
-|--------|-------|--------------|
-| New Tab | `Cmd+T` | Default |
-| Close Tab | `Cmd+W` | Default |
-| Next Tab | `Cmd+]` | Default |
-| Previous Tab | `Cmd+[` | Default |
-| Font Size + | `Cmd+Plus` | Preferences → Keys → + |
-| Font Size - | `Cmd+Minus` | Preferences → Keys → + |
-| Font Size Reset | `Cmd+0` | Preferences → Keys → + |
-
-## Saving Your Configuration
-
-To save your iTerm2 configuration to dotfiles:
-
-1. Open Preferences (`Cmd+,`)
-2. Go to **General → Preferences**
-3. Click **Load preferences from a custom folder**
-4. Select `~/dotfiles/config/iterm2`
-5. Check **Save changes to folder when iTerm2 quits**
-
-This ensures your iTerm2 settings are backed up with your dotfiles.
-
-## Nord Theme Benefits
-
-The Nord color scheme is specifically chosen for:
-- **Reduced eye strain** with muted colors
-- **Excellent contrast** without being harsh
-- **Better readability** for users with vision considerations
-- **Consistent appearance** across Kitty and iTerm2
\ No newline at end of file
diff --git a/config/iterm2/setup-iterm.sh b/config/iterm2/setup-iterm.sh
deleted file mode 100755
index 7502146..0000000
--- a/config/iterm2/setup-iterm.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env bash
-# Setup iTerm2 with Nord theme and matching Kitty settings
-
-set -euo pipefail
-
-DOTFILES_DIR="$HOME/dotfiles"
-ITERM_CONFIG_DIR="$DOTFILES_DIR/config/iterm2"
-
-# Colors
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-BLUE='\033[0;34m'
-NC='\033[0m'
-
-echo -e "${BLUE}Setting up iTerm2 configuration...${NC}"
-
-# 1. Tell iTerm2 to use custom preferences folder
-echo -e "${YELLOW}Configuring iTerm2 to use dotfiles preferences...${NC}"
-defaults write com.googlecode.iterm2 PrefsCustomFolder -string "$ITERM_CONFIG_DIR"
-defaults write com.googlecode.iterm2 LoadPrefsFromCustomFolder -bool true
-
-# 2. Set specific preferences matching Kitty config
-echo -e "${YELLOW}Setting iTerm2 preferences to match Kitty...${NC}"
-
-# Font settings (Iosevka Term SS08, 16pt - matching Kitty)
-defaults write com.googlecode.iterm2 "Normal Font" -string "IosevkaTermSS08-Regular 16"
-defaults write com.googlecode.iterm2 "Non Ascii Font" -string "FiraCodeNerdFontComplete-Regular 16"
-
-# Enable ligatures
-defaults write com.googlecode.iterm2 "ASCII Ligatures" -bool true
-
-# Window size (120x35 characters)
-defaults write com.googlecode.iterm2 "Columns" -int 120
-defaults write com.googlecode.iterm2 "Rows" -int 35
-
-# Transparency (matching Kitty's 0.92 opacity = 8% transparency)
-defaults write com.googlecode.iterm2 "Transparency" -float 0.08
-
-# Scrollback lines (10000)
-defaults write com.googlecode.iterm2 "Scrollback Lines" -int 10000
-
-# Visual bell instead of audio
-defaults write com.googlecode.iterm2 "Silence Bell" -bool false
-defaults write com.googlecode.iterm2 "Visual Bell" -bool true
-
-# Copy on selection
-defaults write com.googlecode.iterm2 "Copy to Pasteboard on Selection" -bool true
-
-# Cursor settings
-defaults write com.googlecode.iterm2 "Cursor Type" -int 0 # Block cursor
-defaults write com.googlecode.iterm2 "Blinking Cursor" -bool true
-
-echo -e "${GREEN}✅ iTerm2 preferences configured${NC}"
-echo ""
-echo -e "${YELLOW}To complete the setup:${NC}"
-echo "1. Open iTerm2"
-echo "2. Go to Preferences > Profiles > Colors"
-echo "3. Click 'Color Presets...' dropdown"
-echo "4. Select 'Import...' and choose: $ITERM_CONFIG_DIR/Nord.itermcolors"
-echo "5. Select 'Nord' from the Color Presets dropdown"
-echo ""
-echo "Optional: Export your full iTerm2 config:"
-echo " Preferences > General > Preferences"
-echo " Click 'Save settings to Folder' and choose: $ITERM_CONFIG_DIR"
\ No newline at end of file
diff --git a/config/neofetch/config.conf b/config/neofetch/config.conf
deleted file mode 100644
index cdba4c6..0000000
--- a/config/neofetch/config.conf
+++ /dev/null
@@ -1,864 +0,0 @@
-# See this wiki page for more info:
-# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
-print_info() {
- info title
- info underline
-
- info "OS" distro
- info "Host" model
- info "Kernel" kernel
- info "Uptime" uptime
- info "Packages" packages
- info "Shell" shell
- info "Resolution" resolution
- info "DE" de
- info "WM" wm
- info "WM Theme" wm_theme
- info "Theme" theme
- info "Icons" icons
- info "Terminal" term
- info "Terminal Font" term_font
- info "CPU" cpu
- info "GPU" gpu
- info "Memory" memory
-
- # info "GPU Driver" gpu_driver # Linux/macOS only
- # info "CPU Usage" cpu_usage
- # info "Disk" disk
- # info "Battery" battery
- # info "Font" font
- # info "Song" song
- # [[ "$player" ]] && prin "Music Player" "$player"
- # info "Local IP" local_ip
- # info "Public IP" public_ip
- # info "Users" users
- # info "Locale" locale # This only works on glibc systems.
-
- info cols
-}
-
-# Title
-
-
-# Hide/Show Fully qualified domain name.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --title_fqdn
-title_fqdn="off"
-
-
-# Kernel
-
-
-# Shorten the output of the kernel function.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --kernel_shorthand
-# Supports: Everything except *BSDs (except PacBSD and PC-BSD)
-#
-# Example:
-# on: '4.8.9-1-ARCH'
-# off: 'Linux 4.8.9-1-ARCH'
-kernel_shorthand="on"
-
-
-# Distro
-
-
-# Shorten the output of the distro function
-#
-# Default: 'off'
-# Values: 'on', 'tiny', 'off'
-# Flag: --distro_shorthand
-# Supports: Everything except Windows and Haiku
-distro_shorthand="off"
-
-# Show/Hide OS Architecture.
-# Show 'x86_64', 'x86' and etc in 'Distro:' output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --os_arch
-#
-# Example:
-# on: 'Arch Linux x86_64'
-# off: 'Arch Linux'
-os_arch="on"
-
-
-# Uptime
-
-
-# Shorten the output of the uptime function
-#
-# Default: 'on'
-# Values: 'on', 'tiny', 'off'
-# Flag: --uptime_shorthand
-#
-# Example:
-# on: '2 days, 10 hours, 3 mins'
-# tiny: '2d 10h 3m'
-# off: '2 days, 10 hours, 3 minutes'
-uptime_shorthand="on"
-
-
-# Memory
-
-
-# Show memory pecentage in output.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --memory_percent
-#
-# Example:
-# on: '1801MiB / 7881MiB (22%)'
-# off: '1801MiB / 7881MiB'
-memory_percent="off"
-
-# Change memory output unit.
-#
-# Default: 'mib'
-# Values: 'kib', 'mib', 'gib'
-# Flag: --memory_unit
-#
-# Example:
-# kib '1020928KiB / 7117824KiB'
-# mib '1042MiB / 6951MiB'
-# gib: ' 0.98GiB / 6.79GiB'
-memory_unit="mib"
-
-
-# Packages
-
-
-# Show/Hide Package Manager names.
-#
-# Default: 'tiny'
-# Values: 'on', 'tiny' 'off'
-# Flag: --package_managers
-#
-# Example:
-# on: '998 (pacman), 8 (flatpak), 4 (snap)'
-# tiny: '908 (pacman, flatpak, snap)'
-# off: '908'
-package_managers="on"
-
-
-# Shell
-
-
-# Show the path to $SHELL
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --shell_path
-#
-# Example:
-# on: '/bin/bash'
-# off: 'bash'
-shell_path="off"
-
-# Show $SHELL version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --shell_version
-#
-# Example:
-# on: 'bash 4.4.5'
-# off: 'bash'
-shell_version="on"
-
-
-# CPU
-
-
-# CPU speed type
-#
-# Default: 'bios_limit'
-# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'.
-# Flag: --speed_type
-# Supports: Linux with 'cpufreq'
-# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value.
-speed_type="bios_limit"
-
-# CPU speed shorthand
-#
-# Default: 'off'
-# Values: 'on', 'off'.
-# Flag: --speed_shorthand
-# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz
-#
-# Example:
-# on: 'i7-6500U (4) @ 3.1GHz'
-# off: 'i7-6500U (4) @ 3.100GHz'
-speed_shorthand="off"
-
-# Enable/Disable CPU brand in output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_brand
-#
-# Example:
-# on: 'Intel i7-6500U'
-# off: 'i7-6500U (4)'
-cpu_brand="on"
-
-# CPU Speed
-# Hide/Show CPU speed.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_speed
-#
-# Example:
-# on: 'Intel i7-6500U (4) @ 3.1GHz'
-# off: 'Intel i7-6500U (4)'
-cpu_speed="on"
-
-# CPU Cores
-# Display CPU cores in output
-#
-# Default: 'logical'
-# Values: 'logical', 'physical', 'off'
-# Flag: --cpu_cores
-# Support: 'physical' doesn't work on BSD.
-#
-# Example:
-# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores)
-# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores)
-# off: 'Intel i7-6500U @ 3.1GHz'
-cpu_cores="logical"
-
-# CPU Temperature
-# Hide/Show CPU temperature.
-# Note the temperature is added to the regular CPU function.
-#
-# Default: 'off'
-# Values: 'C', 'F', 'off'
-# Flag: --cpu_temp
-# Supports: Linux, BSD
-# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable
-# coretemp kernel module. This only supports newer Intel processors.
-#
-# Example:
-# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]'
-# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]'
-# off: 'Intel i7-6500U (4) @ 3.1GHz'
-cpu_temp="off"
-
-
-# GPU
-
-
-# Enable/Disable GPU Brand
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gpu_brand
-#
-# Example:
-# on: 'AMD HD 7950'
-# off: 'HD 7950'
-gpu_brand="on"
-
-# Which GPU to display
-#
-# Default: 'all'
-# Values: 'all', 'dedicated', 'integrated'
-# Flag: --gpu_type
-# Supports: Linux
-#
-# Example:
-# all:
-# GPU1: AMD HD 7950
-# GPU2: Intel Integrated Graphics
-#
-# dedicated:
-# GPU1: AMD HD 7950
-#
-# integrated:
-# GPU1: Intel Integrated Graphics
-gpu_type="all"
-
-
-# Resolution
-
-
-# Display refresh rate next to each monitor
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --refresh_rate
-# Supports: Doesn't work on Windows.
-#
-# Example:
-# on: '1920x1080 @ 60Hz'
-# off: '1920x1080'
-refresh_rate="off"
-
-
-# Gtk Theme / Icons / Font
-
-
-# Shorten output of GTK Theme / Icons / Font
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --gtk_shorthand
-#
-# Example:
-# on: 'Numix, Adwaita'
-# off: 'Numix [GTK2], Adwaita [GTK3]'
-gtk_shorthand="off"
-
-
-# Enable/Disable gtk2 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk2
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Adwaita [GTK3]'
-gtk2="on"
-
-# Enable/Disable gtk3 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk3
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Numix [GTK2]'
-gtk3="on"
-
-
-# IP Address
-
-
-# Website to ping for the public IP
-#
-# Default: 'http://ident.me'
-# Values: 'url'
-# Flag: --ip_host
-public_ip_host="http://ident.me"
-
-# Public IP timeout.
-#
-# Default: '2'
-# Values: 'int'
-# Flag: --ip_timeout
-public_ip_timeout=2
-
-
-# Desktop Environment
-
-
-# Show Desktop Environment version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --de_version
-de_version="on"
-
-
-# Disk
-
-
-# Which disks to display.
-# The values can be any /dev/sdXX, mount point or directory.
-# NOTE: By default we only show the disk info for '/'.
-#
-# Default: '/'
-# Values: '/', '/dev/sdXX', '/path/to/drive'.
-# Flag: --disk_show
-#
-# Example:
-# disk_show=('/' '/dev/sdb1'):
-# 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 823G / 893G (93%)'
-#
-# disk_show=('/'):
-# 'Disk (/): 74G / 118G (66%)'
-#
-disk_show=('/')
-
-# Disk subtitle.
-# What to append to the Disk subtitle.
-#
-# Default: 'mount'
-# Values: 'mount', 'name', 'dir', 'none'
-# Flag: --disk_subtitle
-#
-# Example:
-# name: 'Disk (/dev/sda1): 74G / 118G (66%)'
-# 'Disk (/dev/sdb2): 74G / 118G (66%)'
-#
-# mount: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Local Disk): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 74G / 118G (66%)'
-#
-# dir: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (Local Disk): 74G / 118G (66%)'
-# 'Disk (Videos): 74G / 118G (66%)'
-#
-# none: 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-disk_subtitle="mount"
-
-# Disk percent.
-# Show/Hide disk percent.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --disk_percent
-#
-# Example:
-# on: 'Disk (/): 74G / 118G (66%)'
-# off: 'Disk (/): 74G / 118G'
-disk_percent="on"
-
-
-# Song
-
-
-# Manually specify a music player.
-#
-# Default: 'auto'
-# Values: 'auto', 'player-name'
-# Flag: --music_player
-#
-# Available values for 'player-name':
-#
-# amarok
-# audacious
-# banshee
-# bluemindo
-# clementine
-# cmus
-# deadbeef
-# deepin-music
-# dragon
-# elisa
-# exaile
-# gnome-music
-# gmusicbrowser
-# gogglesmm
-# guayadeque
-# io.elementary.music
-# iTunes
-# juk
-# lollypop
-# mocp
-# mopidy
-# mpd
-# muine
-# netease-cloud-music
-# olivia
-# playerctl
-# pogo
-# pragha
-# qmmp
-# quodlibet
-# rhythmbox
-# sayonara
-# smplayer
-# spotify
-# strawberry
-# tauonmb
-# tomahawk
-# vlc
-# xmms2d
-# xnoise
-# yarock
-music_player="auto"
-
-# Format to display song information.
-#
-# Default: '%artist% - %album% - %title%'
-# Values: '%artist%', '%album%', '%title%'
-# Flag: --song_format
-#
-# Example:
-# default: 'Song: Jet - Get Born - Sgt Major'
-song_format="%artist% - %album% - %title%"
-
-# Print the Artist, Album and Title on separate lines
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --song_shorthand
-#
-# Example:
-# on: 'Artist: The Fratellis'
-# 'Album: Costello Music'
-# 'Song: Chelsea Dagger'
-#
-# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger'
-song_shorthand="off"
-
-# 'mpc' arguments (specify a host, password etc).
-#
-# Default: ''
-# Example: mpc_args=(-h HOST -P PASSWORD)
-mpc_args=()
-
-
-# Text Colors
-
-
-# Text Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --colors
-#
-# Each number represents a different part of the text in
-# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info'
-#
-# Example:
-# colors=(distro) - Text is colored based on Distro colors.
-# colors=(4 6 1 8 8 6) - Text is colored in the order above.
-colors=(distro)
-
-
-# Text Options
-
-
-# Toggle bold text
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bold
-bold="on"
-
-# Enable/Disable Underline
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --underline
-underline_enabled="on"
-
-# Underline character
-#
-# Default: '-'
-# Values: 'string'
-# Flag: --underline_char
-underline_char="-"
-
-
-# Info Separator
-# Replace the default separator with the specified string.
-#
-# Default: ':'
-# Flag: --separator
-#
-# Example:
-# separator="->": 'Shell-> bash'
-# separator=" =": 'WM = dwm'
-separator=":"
-
-
-# Color Blocks
-
-
-# Color block range
-# The range of colors to print.
-#
-# Default: '0', '15'
-# Values: 'num'
-# Flag: --block_range
-#
-# Example:
-#
-# Display colors 0-7 in the blocks. (8 colors)
-# neofetch --block_range 0 7
-#
-# Display colors 0-15 in the blocks. (16 colors)
-# neofetch --block_range 0 15
-block_range=(0 15)
-
-# Toggle color blocks
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --color_blocks
-color_blocks="on"
-
-# Color block width in spaces
-#
-# Default: '3'
-# Values: 'num'
-# Flag: --block_width
-block_width=3
-
-# Color block height in lines
-#
-# Default: '1'
-# Values: 'num'
-# Flag: --block_height
-block_height=1
-
-# Color Alignment
-#
-# Default: 'auto'
-# Values: 'auto', 'num'
-# Flag: --col_offset
-#
-# Number specifies how far from the left side of the terminal (in spaces) to
-# begin printing the columns, in case you want to e.g. center them under your
-# text.
-# Example:
-# col_offset="auto" - Default behavior of neofetch
-# col_offset=7 - Leave 7 spaces then print the colors
-col_offset="auto"
-
-# Progress Bars
-
-
-# Bar characters
-#
-# Default: '-', '='
-# Values: 'string', 'string'
-# Flag: --bar_char
-#
-# Example:
-# neofetch --bar_char 'elapsed' 'total'
-# neofetch --bar_char '-' '='
-bar_char_elapsed="-"
-bar_char_total="="
-
-# Toggle Bar border
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bar_border
-bar_border="on"
-
-# Progress bar length in spaces
-# Number of chars long to make the progress bars.
-#
-# Default: '15'
-# Values: 'num'
-# Flag: --bar_length
-bar_length=15
-
-# Progress bar colors
-# When set to distro, uses your distro's logo colors.
-#
-# Default: 'distro', 'distro'
-# Values: 'distro', 'num'
-# Flag: --bar_colors
-#
-# Example:
-# neofetch --bar_colors 3 4
-# neofetch --bar_colors distro 5
-bar_color_elapsed="distro"
-bar_color_total="distro"
-
-
-# Info display
-# Display a bar with the info.
-#
-# Default: 'off'
-# Values: 'bar', 'infobar', 'barinfo', 'off'
-# Flags: --cpu_display
-# --memory_display
-# --battery_display
-# --disk_display
-#
-# Example:
-# bar: '[---=======]'
-# infobar: 'info [---=======]'
-# barinfo: '[---=======] info'
-# off: 'info'
-cpu_display="off"
-memory_display="off"
-battery_display="off"
-disk_display="off"
-
-
-# Backend Settings
-
-
-# Image backend.
-#
-# Default: 'ascii'
-# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off',
-# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty'
-# Flag: --backend
-image_backend="ascii"
-
-# Image Source
-#
-# Which image or ascii file to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/'
-# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")'
-# Flag: --source
-#
-# NOTE: 'auto' will pick the best image source for whatever image backend is used.
-# In ascii mode, distro ascii art will be used and in an image mode, your
-# wallpaper will be used.
-image_source="auto"
-
-
-# Ascii Options
-
-
-# Ascii distro
-# Which distro's ascii art to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'distro_name'
-# Flag: --ascii_distro
-# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS",
-# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs,
-# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock,
-# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD,
-# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
-# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover,
-# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin,
-# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary,
-# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
-# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
-# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra,
-# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion,
-# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite,
-# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva,
-# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib,
-# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner,
-# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba,
-# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD,
-# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint,
-# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix,
-# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan,
-# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific,
-# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz,
-# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS,
-# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails,
-# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio,
-# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin,
-# and IRIX have ascii logos
-# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants.
-# Use '{distro name}_old' to use the old logos.
-# NOTE: Ubuntu has flavor variants.
-# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
-# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
-# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
-# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
-# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
-# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
-# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
-# postmarketOS, and Void have a smaller logo variant.
-# Use '{distro name}_small' to use the small variants.
-ascii_distro="auto"
-
-# Ascii Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --ascii_colors
-#
-# Example:
-# ascii_colors=(distro) - Ascii is colored based on Distro colors.
-# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors.
-ascii_colors=(distro)
-
-# Bold ascii logo
-# Whether or not to bold the ascii logo.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --ascii_bold
-ascii_bold="on"
-
-
-# Image Options
-
-
-# Image loop
-# Setting this to on will make neofetch redraw the image constantly until
-# Ctrl+C is pressed. This fixes display issues in some terminal emulators.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --loop
-image_loop="off"
-
-# Thumbnail directory
-#
-# Default: '~/.cache/thumbnails/neofetch'
-# Values: 'dir'
-thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch"
-
-# Crop mode
-#
-# Default: 'normal'
-# Values: 'normal', 'fit', 'fill'
-# Flag: --crop_mode
-#
-# See this wiki page to learn about the fit and fill options.
-# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F
-crop_mode="normal"
-
-# Crop offset
-# Note: Only affects 'normal' crop mode.
-#
-# Default: 'center'
-# Values: 'northwest', 'north', 'northeast', 'west', 'center'
-# 'east', 'southwest', 'south', 'southeast'
-# Flag: --crop_offset
-crop_offset="center"
-
-# Image size
-# The image is half the terminal width by default.
-#
-# Default: 'auto'
-# Values: 'auto', '00px', '00%', 'none'
-# Flags: --image_size
-# --size
-image_size="auto"
-
-# Gap between image and text
-#
-# Default: '3'
-# Values: 'num', '-num'
-# Flag: --gap
-gap=3
-
-# Image offsets
-# Only works with the w3m backend.
-#
-# Default: '0'
-# Values: 'px'
-# Flags: --xoffset
-# --yoffset
-yoffset=0
-xoffset=0
-
-# Image background color
-# Only works with the w3m backend.
-#
-# Default: ''
-# Values: 'color', 'blue'
-# Flag: --bg_color
-background_color=
-
-
-# Misc Options
-
-# Stdout mode
-# Turn off all colors and disables image backend (ASCII/Image).
-# Useful for piping into another command.
-# Default: 'off'
-# Values: 'on', 'off'
-stdout="off"
diff --git a/config/swiftbar/plugins/moon-phase.1h.sh b/config/swiftbar/plugins/moon-phase.1h.sh
deleted file mode 100755
index f4c5cac..0000000
--- a/config/swiftbar/plugins/moon-phase.1h.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/bash
-
-# 🌙 SwiftBar Plugin: Symbolic Moon Phase Monitor
-# Author: GPT + David
-# Requires: curl, jq, awk
-# Caches data for 6h to reduce API use
-
-API_KEY="6ec71a8170214d828c08ba8bf2ca29e9"
-CURL="/usr/bin/curl"
-JQ="/usr/bin/jq"
-AWK="/usr/bin/awk"
-CACHE_FILE="$HOME/.cache/moonphase.json"
-STATE_FILE="$HOME/.lunarstate"
-MAX_AGE_HOURS=6
-
-mkdir -p "$(dirname "$CACHE_FILE")"
-
-# Check cache freshness
-NEEDS_UPDATE=true
-if [ -f "$CACHE_FILE" ]; then
- MOD_UNIX=$(stat -f "%m" "$CACHE_FILE")
- NOW_UNIX=$(date +%s)
- AGE_HOURS=$(( (NOW_UNIX - MOD_UNIX) / 3600 ))
- [ "$AGE_HOURS" -lt "$MAX_AGE_HOURS" ] && NEEDS_UPDATE=false
-fi
-
-# Fetch and cache
-if [ "$NEEDS_UPDATE" = true ]; then
- MOON_JSON=$($CURL -s "https://api.ipgeolocation.io/astronomy?apiKey=$API_KEY")
- echo "$MOON_JSON" > "$CACHE_FILE"
-else
- MOON_JSON=$(cat "$CACHE_FILE")
-fi
-
-# Extract fields
-PHASE=$(echo "$MOON_JSON" | $JQ -r '.moon_phase')
-ILLUM=$(echo "$MOON_JSON" | $JQ -r '.moon_illumination_percentage' | $AWK '{printf "%.0f", $1}')
-MOONRISE=$(echo "$MOON_JSON" | $JQ -r '.moonrise')
-MOONSET=$(echo "$MOON_JSON" | $JQ -r '.moonset')
-
-PHASE_LC=$(echo "$PHASE" | tr '[:upper:]' '[:lower:]')
-
-# Ritual glyphs & poetic names
-declare -A ICONS=(
- ["new_moon"]="🌑"
- ["waxing_crescent"]="🌒"
- ["first_quarter"]="🌓"
- ["waxing_gibbous"]="🌔"
- ["full_moon"]="🌕"
- ["waning_gibbous"]="🌖"
- ["last_quarter"]="🌗"
- ["waning_crescent"]="🌘"
-)
-declare -A POETIC=(
- ["new_moon"]="Veiled Mother"
- ["waxing_crescent"]="Hesitant Flame"
- ["first_quarter"]="Climbing Eye"
- ["waxing_gibbous"]="Gathering Tide"
- ["full_moon"]="Revealed Bride"
- ["waning_gibbous"]="Harvest Wane"
- ["last_quarter"]="Parting Mirror"
- ["waning_crescent"]="Waning Daughter"
-)
-
-ICON="${ICONS[$PHASE_LC]:-❓}"
-POETIC_NAME="${POETIC[$PHASE_LC]:-Unknown Phase}"
-
-# Direction
-ARROW="⬆"
-[[ "$PHASE_LC" =~ ^(full_moon|waning_gibbous|last_quarter|waning_crescent)$ ]] && ARROW="⬇"
-
-# Ritual detection
-NOTICE=""
-if [[ "$PHASE_LC" == "full_moon" ]]; then
- NOTICE="☽ FULL RITE ☾"
-elif [[ "$PHASE_LC" == "new_moon" ]]; then
- NOTICE="☉ NEW SILENCE ☉"
-fi
-
-# Output to menubar
-echo "$ICON $ARROW ${ILLUM}%"
-echo "---"
-echo "Phase: $(echo "$PHASE" | tr '_' ' ' | awk '{for (i=1; i<=NF; i++) $i=toupper(substr($i,1,1)) substr($i,2)} 1')"
-echo "Poetic: $POETIC_NAME"
-echo "Illumination: ${ILLUM}%"
-echo "Moonrise: $MOONRISE"
-echo "Moonset: $MOONSET"
-[ -n "$NOTICE" ] && echo "$NOTICE"
-echo "Last updated: $(date -r "$CACHE_FILE" "+%H:%M %Z")"
-
-# Optional: write state file for system rituals
-echo "$PHASE_LC,$ILLUM,$POETIC_NAME,$NOTICE" > "$STATE_FILE"
\ No newline at end of file
diff --git a/git/hooks/post-checkout b/git/hooks/post-checkout
new file mode 100755
index 0000000..5abf8ed
--- /dev/null
+++ b/git/hooks/post-checkout
@@ -0,0 +1,3 @@
+#!/bin/sh
+command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-checkout' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; }
+git lfs post-checkout "$@"
diff --git a/git/hooks/post-commit b/git/hooks/post-commit
new file mode 100755
index 0000000..b8b76c2
--- /dev/null
+++ b/git/hooks/post-commit
@@ -0,0 +1,3 @@
+#!/bin/sh
+command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-commit' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; }
+git lfs post-commit "$@"
diff --git a/git/hooks/post-merge b/git/hooks/post-merge
new file mode 100755
index 0000000..726f909
--- /dev/null
+++ b/git/hooks/post-merge
@@ -0,0 +1,3 @@
+#!/bin/sh
+command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-merge' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; }
+git lfs post-merge "$@"
diff --git a/git/hooks/pre-push b/git/hooks/pre-push
new file mode 100755
index 0000000..5f26dc4
--- /dev/null
+++ b/git/hooks/pre-push
@@ -0,0 +1,3 @@
+#!/bin/sh
+command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'pre-push' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; }
+git lfs pre-push "$@"
diff --git a/scripts/backup-all-secrets.sh b/scripts/backup-all-secrets.sh
index 41a659c..87617da 100755
--- a/scripts/backup-all-secrets.sh
+++ b/scripts/backup-all-secrets.sh
@@ -50,6 +50,12 @@ if [[ -f "$HOME/.docker/config.json" ]]; then
cp "$HOME/.docker/config.json" "$TEMP_DIR/secrets/.docker/"
fi
+# Password store (pass — software licenses, credentials)
+if [[ -d "$HOME/.password-store" ]]; then
+ echo " 🔑 Password store (pass)"
+ cp -r "$HOME/.password-store" "$TEMP_DIR/secrets/"
+fi
+
# Any license files or certificates (if found)
if [[ -f "$HOME/.vuescanrc" ]]; then
echo " 📄 VueScan license"
diff --git a/scripts/backup-private-keys.sh b/scripts/backup-private-keys.sh
deleted file mode 100755
index 1742e5a..0000000
--- a/scripts/backup-private-keys.sh
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/usr/bin/env bash
-# Backup all private keys and sensitive configurations
-# Following prime directive: durable, thoughtful backup strategy
-
-set -euo pipefail
-
-BACKUP_DIR="$HOME/dotfiles/backups"
-TIMESTAMP=$(date +%Y%m%d_%H%M%S)
-
-# Colors
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-RED='\033[0;31m'
-NC='\033[0m'
-
-echo -e "${YELLOW}🔐 Creating encrypted backup of private keys and secrets${NC}"
-echo "Timestamp: $TIMESTAMP"
-echo ""
-
-# Create backup directory
-mkdir -p "$BACKUP_DIR"/{ssh,gpg,docker}
-
-# Function to create encrypted backup
-create_encrypted_backup() {
- local source_dir="$1"
- local backup_name="$2"
- local backup_path="$BACKUP_DIR/$backup_name"
-
- if [[ -d "$source_dir" ]] || [[ -f "$source_dir" ]]; then
- echo -e "${YELLOW}Backing up: $source_dir${NC}"
-
- # Create tar archive and encrypt in one step
- tar -czf - -C "$(dirname "$source_dir")" "$(basename "$source_dir")" | \
- gpg --symmetric --cipher-algo AES256 --compress-algo 2 \
- --output "${backup_path}/${backup_name}_${TIMESTAMP}.tar.gz.gpg"
-
- # Create restore instructions
- cat > "${backup_path}/RESTORE_INSTRUCTIONS.md" << EOF
-# ${backup_name^} Restore Instructions
-
-## Decrypting and Restoring ${backup_name^}
-
-To restore from backup: \`${backup_name}_${TIMESTAMP}.tar.gz.gpg\`
-
-### Step 1: Decrypt the backup
-\`\`\`bash
-gpg --decrypt ${backup_name}_${TIMESTAMP}.tar.gz.gpg > ${backup_name}_${TIMESTAMP}.tar.gz
-\`\`\`
-
-### Step 2: Extract the archive
-\`\`\`bash
-tar -xzf ${backup_name}_${TIMESTAMP}.tar.gz -C ~/
-\`\`\`
-
-### Step 3: Set correct permissions
-\`\`\`bash
-chmod 700 ~/$(basename "$source_dir")
-find ~/$(basename "$source_dir") -type f -exec chmod 600 {} \;
-\`\`\`
-
-## Security Notes
-
-- Keep this encrypted backup secure
-- Contains private keys/sensitive data
-- Test restore process periodically
-
-## Backup Contents
-
-This backup includes: $(basename "$source_dir")
-
-Created: $(date)
-System: $(sw_vers -productVersion)
-EOF
-
- echo -e "${GREEN}✅ Backup created: ${backup_path}/${backup_name}_${TIMESTAMP}.tar.gz.gpg${NC}"
- else
- echo -e "${RED}⚠️ Source not found: $source_dir${NC}"
- fi
-}
-
-# Backup GPG private keys and keyring
-if [[ -d "$HOME/.gnupg" ]]; then
- echo -e "${YELLOW}🔑 Backing up GPG private keys and keyring...${NC}"
-
- # Create temporary directory with essential GPG files
- temp_gpg=$(mktemp -d)
- mkdir -p "$temp_gpg/.gnupg"
-
- # Copy essential GPG files (not temporary/socket files)
- cp -r "$HOME/.gnupg/private-keys-v1.d" "$temp_gpg/.gnupg/" 2>/dev/null || true
- cp "$HOME/.gnupg/pubring.kbx" "$temp_gpg/.gnupg/" 2>/dev/null || true
- cp "$HOME/.gnupg/trustdb.gpg" "$temp_gpg/.gnupg/" 2>/dev/null || true
- cp "$HOME/.gnupg/gpg.conf" "$temp_gpg/.gnupg/" 2>/dev/null || true
- cp "$HOME/.gnupg/gpg-agent.conf" "$temp_gpg/.gnupg/" 2>/dev/null || true
- cp "$HOME/.gnupg/dirmngr.conf" "$temp_gpg/.gnupg/" 2>/dev/null || true
-
- # Create encrypted backup
- tar -czf - -C "$temp_gpg" .gnupg | \
- gpg --symmetric --cipher-algo AES256 --compress-algo 2 \
- --output "$BACKUP_DIR/gpg/gpg_keyring_${TIMESTAMP}.tar.gz.gpg"
-
- # Cleanup
- rm -rf "$temp_gpg"
-
- # Create restore instructions
- cat > "$BACKUP_DIR/gpg/RESTORE_INSTRUCTIONS.md" << 'EOF'
-# GPG Keyring Restore Instructions
-
-## Decrypting and Restoring GPG Keys
-
-To restore from backup: `gpg_keyring_TIMESTAMP.tar.gz.gpg`
-
-### Step 1: Decrypt the backup
-```bash
-gpg --decrypt gpg_keyring_TIMESTAMP.tar.gz.gpg > gpg_keyring_TIMESTAMP.tar.gz
-```
-
-### Step 2: Extract to home directory
-```bash
-tar -xzf gpg_keyring_TIMESTAMP.tar.gz -C ~/
-```
-
-### Step 3: Set correct permissions
-```bash
-chmod 700 ~/.gnupg
-chmod 600 ~/.gnupg/*
-chmod 700 ~/.gnupg/private-keys-v1.d
-chmod 600 ~/.gnupg/private-keys-v1.d/*
-```
-
-### Step 4: Restart GPG agent
-```bash
-gpgconf --kill gpg-agent
-gpg --list-secret-keys # This will restart the agent
-```
-
-## Security Notes
-
-- Contains your GPG private keys - highly sensitive
-- Keep encrypted backup in secure location
-- Test restore process periodically
-
-## What's Included
-
-- Private keys (private-keys-v1.d/)
-- Public keyring (pubring.kbx)
-- Trust database (trustdb.gpg)
-- GPG configuration files
-
-Created: $(date)
-System: $(sw_vers -productVersion)
-EOF
-
- echo -e "${GREEN}✅ GPG keyring backup created${NC}"
-fi
-
-# Backup Docker configuration
-if [[ -f "$HOME/.docker/config.json" ]]; then
- create_encrypted_backup "$HOME/.docker" "docker"
-fi
-
-# Summary
-echo ""
-echo -e "${GREEN}🎉 Backup Summary:${NC}"
-echo "📁 Backups stored in: $BACKUP_DIR"
-echo "🔐 All backups are GPG encrypted with AES256"
-echo "📋 Each backup includes restore instructions"
-echo ""
-echo -e "${YELLOW}💡 Recommended: Store a copy of these backups in a separate secure location${NC}"
-echo -e "${YELLOW}📋 Test restore process periodically to ensure backups work${NC}"
\ No newline at end of file
diff --git a/scripts/backup-ssh-keys.sh b/scripts/backup-ssh-keys.sh
deleted file mode 100755
index 4dbd974..0000000
--- a/scripts/backup-ssh-keys.sh
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/usr/bin/env bash
-# Backup and encrypt SSH keys
-
-set -euo pipefail
-
-SSH_DIR="$HOME/.ssh"
-BACKUP_DIR="$HOME/dotfiles/backups/ssh"
-TIMESTAMP=$(date +%Y%m%d_%H%M%S)
-
-# Colors
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-RED='\033[0;31m'
-BLUE='\033[0;34m'
-NC='\033[0m'
-
-echo -e "${BLUE}SSH Keys Backup & Encryption${NC}"
-echo "==============================="
-
-# Check if SSH directory exists
-if [ ! -d "$SSH_DIR" ]; then
- echo -e "${RED}❌ SSH directory not found: $SSH_DIR${NC}"
- exit 1
-fi
-
-# Check if GPG is available
-if ! command -v gpg >/dev/null 2>&1; then
- echo -e "${RED}❌ GPG not found. Please install GPG first.${NC}"
- echo "Install with: brew install gnupg"
- exit 1
-fi
-
-# Create backup directory
-mkdir -p "$BACKUP_DIR"
-
-echo -e "${YELLOW}🔍 Scanning SSH directory...${NC}"
-
-# Find private keys (files without .pub extension and not config/known_hosts)
-PRIVATE_KEYS=()
-while IFS= read -r -d '' file; do
- filename=$(basename "$file")
- # Skip public keys, config files, and known_hosts
- if [[ ! "$filename" =~ \.(pub|ppk)$ ]] && \
- [[ "$filename" != "config" ]] && \
- [[ "$filename" != "known_hosts" ]] && \
- [[ "$filename" != "authorized_keys" ]]; then
- PRIVATE_KEYS+=("$file")
- fi
-done < <(find "$SSH_DIR" -type f -print0)
-
-if [ ${#PRIVATE_KEYS[@]} -eq 0 ]; then
- echo -e "${YELLOW}⚠️ No private keys found to backup${NC}"
- exit 0
-fi
-
-echo -e "${GREEN}Found ${#PRIVATE_KEYS[@]} private key(s):${NC}"
-for key in "${PRIVATE_KEYS[@]}"; do
- echo " • $(basename "$key")"
-done
-echo ""
-
-# Ask for confirmation
-read -p "Proceed with backup and encryption? (y/N) " -n 1 -r
-echo
-if [[ ! $REPLY =~ ^[Yy]$ ]]; then
- echo "Backup cancelled."
- exit 0
-fi
-
-# Create tarball of SSH directory
-TEMP_TAR="/tmp/ssh_backup_${TIMESTAMP}.tar"
-echo -e "${YELLOW}📦 Creating backup archive...${NC}"
-
-# Create tar with only the files we want
-tar -cf "$TEMP_TAR" -C "$HOME" .ssh/config 2>/dev/null || true
-
-# Add private keys to tar
-for key in "${PRIVATE_KEYS[@]}"; do
- relative_path=$(echo "$key" | sed "s|$HOME/||")
- tar -rf "$TEMP_TAR" -C "$HOME" "$relative_path" 2>/dev/null || true
- echo " ✓ Added: $(basename "$key")"
-done
-
-# Add public keys corresponding to private keys
-for key in "${PRIVATE_KEYS[@]}"; do
- pub_key="${key}.pub"
- if [ -f "$pub_key" ]; then
- relative_path=$(echo "$pub_key" | sed "s|$HOME/||")
- tar -rf "$TEMP_TAR" -C "$HOME" "$relative_path" 2>/dev/null || true
- echo " ✓ Added: $(basename "$pub_key")"
- fi
-done
-
-# Compress the tar
-gzip "$TEMP_TAR"
-TEMP_TAR="${TEMP_TAR}.gz"
-
-# Encrypt with GPG
-ENCRYPTED_FILE="$BACKUP_DIR/ssh_keys_${TIMESTAMP}.tar.gz.gpg"
-
-echo -e "${YELLOW}🔐 Encrypting backup...${NC}"
-echo "You will be prompted for a passphrase to encrypt the backup."
-
-if gpg --symmetric --cipher-algo AES256 --compress-algo 1 --s2k-mode 3 \
- --s2k-digest-algo SHA512 --s2k-count 65536 \
- --output "$ENCRYPTED_FILE" "$TEMP_TAR"; then
-
- # Clean up temporary file
- rm "$TEMP_TAR"
-
- echo -e "${GREEN}✅ SSH keys backup completed!${NC}"
- echo ""
- echo "Backup details:"
- echo " 📁 Location: $ENCRYPTED_FILE"
- echo " 📏 Size: $(du -h "$ENCRYPTED_FILE" | cut -f1)"
- echo " 🔑 Encryption: AES256"
- echo ""
-
- # Create restore instructions
- cat > "$BACKUP_DIR/RESTORE_INSTRUCTIONS.md" << EOF
-# SSH Keys Restore Instructions
-
-## Decrypting and Restoring SSH Keys
-
-To restore from backup: \`ssh_keys_${TIMESTAMP}.tar.gz.gpg\`
-
-### Step 1: Decrypt the backup
-\`\`\`bash
-gpg --decrypt ssh_keys_${TIMESTAMP}.tar.gz.gpg > ssh_keys_${TIMESTAMP}.tar.gz
-\`\`\`
-
-### Step 2: Extract the archive
-\`\`\`bash
-tar -xzf ssh_keys_${TIMESTAMP}.tar.gz -C ~/
-\`\`\`
-
-### Step 3: Set correct permissions
-\`\`\`bash
-chmod 700 ~/.ssh
-chmod 600 ~/.ssh/config
-chmod 600 ~/.ssh/*_key ~/.ssh/id_*
-chmod 644 ~/.ssh/*.pub
-\`\`\`
-
-### Step 4: Add keys to SSH agent (if needed)
-\`\`\`bash
-ssh-add ~/.ssh/your_key_name
-\`\`\`
-
-## Security Notes
-
-- Keep this encrypted backup in a secure location
-- The backup contains your private keys - treat it as highly sensitive
-- Consider storing a copy in a different location (cloud storage, external drive)
-- Test the restore process periodically
-
-## Backup Contents
-
-This backup includes:
-- SSH configuration file
-- Private keys found in ~/.ssh/
-- Corresponding public keys
-- Proper directory structure
-
-Created: $(date)
-System: $(sw_vers -productVersion)
-EOF
-
- echo -e "${YELLOW}📋 Restore instructions created: $BACKUP_DIR/RESTORE_INSTRUCTIONS.md${NC}"
-
- # Clean up old backups (keep last 5)
- cd "$BACKUP_DIR"
- ls -t ssh_keys_*.tar.gz.gpg 2>/dev/null | tail -n +6 | xargs -r rm
-
- echo -e "${GREEN}🎉 Backup process complete!${NC}"
-
-else
- # Clean up on failure
- rm -f "$TEMP_TAR"
- echo -e "${RED}❌ Encryption failed!${NC}"
- exit 1
-fi
\ No newline at end of file
diff --git a/scripts/setup-capablemind.sh b/scripts/setup-capablemind.sh
new file mode 100755
index 0000000..bb46a24
--- /dev/null
+++ b/scripts/setup-capablemind.sh
@@ -0,0 +1,173 @@
+#!/usr/bin/env bash
+# CapableMind development environment setup
+# Run after engage (Brewfile) has installed base packages
+#
+# Prerequisites: Homebrew, Ollama, GPG, pass
+# This script sets up: nvm/Node, Ollama models, BMF, launchd agents
+
+set -euo pipefail
+
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+RED='\033[0;31m'
+NC='\033[0m'
+
+echo -e "${YELLOW}Setting up CapableMind development environment${NC}"
+echo ""
+
+# ============================================
+# 1. NVM + Node.js
+# ============================================
+echo -e "${YELLOW}1. Node.js via nvm${NC}"
+
+if [ -d "$HOME/.nvm" ]; then
+ echo -e "${GREEN} ✓ nvm already installed${NC}"
+else
+ echo " Installing nvm..."
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
+fi
+
+export NVM_DIR="$HOME/.nvm"
+[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
+
+if command -v node >/dev/null && [[ "$(node -v)" == v22.* ]]; then
+ echo -e "${GREEN} ✓ Node $(node -v) installed${NC}"
+else
+ echo " Installing Node 22 LTS..."
+ nvm install 22
+ nvm alias default 22
+fi
+
+# ============================================
+# 2. Ollama models
+# ============================================
+echo ""
+echo -e "${YELLOW}2. Ollama models${NC}"
+
+if ! command -v ollama >/dev/null; then
+ echo -e "${RED} ✗ Ollama not installed. Install via: brew install ollama${NC}"
+else
+ # Required models for CapableMind
+ MODELS=("mxbai-embed-large" "qwen3.5:4b")
+
+ for model in "${MODELS[@]}"; do
+ if ollama list 2>/dev/null | grep -q "$model"; then
+ echo -e "${GREEN} ✓ $model already pulled${NC}"
+ else
+ echo " Pulling $model..."
+ ollama pull "$model"
+ fi
+ done
+
+ echo -e "${YELLOW} Note: cm-david trained models must be imported separately from clasp${NC}"
+fi
+
+# ============================================
+# 3. Clone repositories
+# ============================================
+echo ""
+echo -e "${YELLOW}3. Repositories${NC}"
+
+DEV_DIR="$HOME/_Dev"
+mkdir -p "$DEV_DIR"
+
+declare -A REPOS=(
+ ["BetterMemories.io"]="git@github.com:skemantix/BetterMemories.io.git"
+ ["CapableMind-AI"]="git@github.com:skemantix/CapableMind.ai.git"
+ ["chamber-library"]="git@github.com:skemantix/chamber-library.git"
+ ["animal-davidglidden-eu"]="git@github.com:davidglidden/animal-davidglidden-eu.git"
+)
+
+for dir in "${!REPOS[@]}"; do
+ if [ -d "$DEV_DIR/$dir" ]; then
+ echo -e "${GREEN} ✓ $dir already cloned${NC}"
+ else
+ echo " Cloning $dir..."
+ git clone "${REPOS[$dir]}" "$DEV_DIR/$dir"
+ fi
+done
+
+# ============================================
+# 4. BMF build
+# ============================================
+echo ""
+echo -e "${YELLOW}4. Building BetterMemories (BMF)${NC}"
+
+BMF_DIR="$DEV_DIR/BetterMemories.io"
+if [ -d "$BMF_DIR" ]; then
+ cd "$BMF_DIR"
+ npm install
+ npm run build
+ echo -e "${GREEN} ✓ BMF built${NC}"
+else
+ echo -e "${RED} ✗ BMF directory not found${NC}"
+fi
+
+# ============================================
+# 5. Environment file
+# ============================================
+echo ""
+echo -e "${YELLOW}5. CapableMind environment${NC}"
+
+CM_DIR="$HOME/.capablemind"
+mkdir -p "$CM_DIR"
+
+if [ -f "$CM_DIR/env" ]; then
+ echo -e "${GREEN} ✓ env file exists${NC}"
+else
+ cat > "$CM_DIR/env" << 'ENVEOF'
+# CapableMind environment — add your API key
+# ANTHROPIC_API_KEY=sk-ant-...
+ENVEOF
+ echo -e "${YELLOW} ⚠ Created $CM_DIR/env — add your ANTHROPIC_API_KEY${NC}"
+fi
+
+# ============================================
+# 6. Launchd agents
+# ============================================
+echo ""
+echo -e "${YELLOW}6. Launchd agents${NC}"
+
+AGENTS_DIR="$HOME/Library/LaunchAgents"
+DOTFILES_CM="$HOME/dotfiles/config/capablemind"
+
+if [ -d "$DOTFILES_CM" ]; then
+ for plist in "$DOTFILES_CM"/*.plist; do
+ name=$(basename "$plist")
+ if [ -f "$AGENTS_DIR/$name" ]; then
+ echo -e "${GREEN} ✓ $name already installed${NC}"
+ else
+ cp "$plist" "$AGENTS_DIR/"
+ echo -e "${GREEN} ✓ Installed $name${NC}"
+ echo -e "${YELLOW} Note: Edit paths in $AGENTS_DIR/$name before loading${NC}"
+ fi
+ done
+else
+ echo -e "${YELLOW} ⚠ No capablemind config dir in dotfiles${NC}"
+fi
+
+# ============================================
+# 7. Obsidian vault git mirror
+# ============================================
+echo ""
+echo -e "${YELLOW}7. Obsidian vault sync${NC}"
+
+VAULT_GIT="$DEV_DIR/david-root-and-branch-vault-git"
+if [ -d "$VAULT_GIT" ]; then
+ echo -e "${GREEN} ✓ Vault git mirror exists${NC}"
+else
+ echo -e "${YELLOW} ⚠ Vault git mirror not set up. Run ~/bin/obsidian_vault_sync.sh manually${NC}"
+fi
+
+# ============================================
+# Summary
+# ============================================
+echo ""
+echo -e "${GREEN}Setup complete.${NC}"
+echo ""
+echo -e "${YELLOW}Remaining manual steps:${NC}"
+echo " 1. Add ANTHROPIC_API_KEY to ~/.capablemind/env"
+echo " 2. Edit launchd plist paths if needed, then: launchctl load ~/Library/LaunchAgents/com.capablemind.*.plist"
+echo " 3. Import trained cm-david models from clasp (if available)"
+echo " 4. Run: cd ~/_Dev/BetterMemories.io && node dist/index.js (to start BMF)"
+echo " 5. Reconnect MCP in Claude Code: /mcp"
diff --git a/scripts/symlinks.sh b/scripts/symlinks.sh
index 736e8db..7fdcc57 100755
--- a/scripts/symlinks.sh
+++ b/scripts/symlinks.sh
@@ -44,8 +44,6 @@ link_file "$DOTFILES_DIR/shell/.zshrc" "$HOME/.zshrc"
link_file "$DOTFILES_DIR/shell/.bashrc" "$HOME/.bashrc"
link_file "$DOTFILES_DIR/shell/.zprofile" "$HOME/.zprofile"
link_file "$DOTFILES_DIR/shell/.p10k.zsh" "$HOME/.p10k.zsh"
-link_file "$DOTFILES_DIR/shell/.fzf.bash" "$HOME/.fzf.bash"
-link_file "$DOTFILES_DIR/shell/.fzf.zsh" "$HOME/.fzf.zsh"
link_file "$DOTFILES_DIR/.gitconfig" "$HOME/.gitconfig"
link_file "$DOTFILES_DIR/.vimrc" "$HOME/.vimrc"
link_file "$DOTFILES_DIR/.npmrc" "$HOME/.npmrc"
@@ -78,8 +76,11 @@ fi
echo -e "${YELLOW}Linking config directories...${NC}"
mkdir -p "$HOME/.config"
+# CLAUDE.md — prime directive for Claude Code
+link_file "$DOTFILES_DIR/CLAUDE.md" "$HOME/CLAUDE.md"
+
# Link config subdirectories if they exist
-for config_dir in git iterm2 kitty karabiner neofetch swiftbar; do
+for config_dir in git kitty karabiner capablemind; do
if [ -d "$DOTFILES_DIR/config/$config_dir" ]; then
link_file "$DOTFILES_DIR/config/$config_dir" "$HOME/.config/$config_dir"
fi
diff --git a/shell/.bashrc b/shell/.bashrc
index cf70f47..e69de29 100644
--- a/shell/.bashrc
+++ b/shell/.bashrc
@@ -1 +0,0 @@
-[ -f ~/.fzf.bash ] && source ~/.fzf.bash
diff --git a/shell/.fzf.bash b/shell/.fzf.bash
deleted file mode 100644
index 619b5dd..0000000
--- a/shell/.fzf.bash
+++ /dev/null
@@ -1,7 +0,0 @@
-# Setup fzf
-# ---------
-if [[ ! "$PATH" == */Users/davidglidden/.fzf/bin* ]]; then
- PATH="${PATH:+${PATH}:}/Users/davidglidden/.fzf/bin"
-fi
-
-eval "$(fzf --bash)"
diff --git a/shell/.fzf.zsh b/shell/.fzf.zsh
deleted file mode 100644
index cd64ad2..0000000
--- a/shell/.fzf.zsh
+++ /dev/null
@@ -1,7 +0,0 @@
-# Setup fzf
-# ---------
-if [[ ! "$PATH" == */Users/davidglidden/.fzf/bin* ]]; then
- PATH="${PATH:+${PATH}:}/Users/davidglidden/.fzf/bin"
-fi
-
-source <(fzf --zsh)
diff --git a/shell/.zsh-plugins.txt b/shell/.zsh-plugins.txt
index 54c2bcd..025f9fa 100644
--- a/shell/.zsh-plugins.txt
+++ b/shell/.zsh-plugins.txt
@@ -12,8 +12,6 @@ chisui/zsh-nix-shell # If using Nix at some point
# Git integration
olivierverdier/zsh-git-prompt # Lightweight git aliases/completions
-# FZF integration (optional, only if you use fzf)
-unixorn/fzf-zsh-plugin
# Completions (optional, only if you reinstall these tools)
# mullvad/mullvad-zsh-completions
diff --git a/shell/.zsh_plugins.txt b/shell/.zsh_plugins.txt
index 54c2bcd..025f9fa 100644
--- a/shell/.zsh_plugins.txt
+++ b/shell/.zsh_plugins.txt
@@ -12,8 +12,6 @@ chisui/zsh-nix-shell # If using Nix at some point
# Git integration
olivierverdier/zsh-git-prompt # Lightweight git aliases/completions
-# FZF integration (optional, only if you use fzf)
-unixorn/fzf-zsh-plugin
# Completions (optional, only if you reinstall these tools)
# mullvad/mullvad-zsh-completions
diff --git a/shell/.zshrc b/shell/.zshrc
index 98fef11..01edaf0 100644
--- a/shell/.zshrc
+++ b/shell/.zshrc
@@ -114,20 +114,17 @@ zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'
# TOOL INTEGRATIONS
# ═══════════════════════════════════════════════════════════════════════════════
-# FZF integration
-if [[ -f ~/.fzf.zsh ]]; then
- source ~/.fzf.zsh
-elif command -v fzf >/dev/null; then
- # Manual key bindings if fzf is available but not set up
- eval "$(fzf --zsh)" 2>/dev/null || true
-fi
+# (fzf and zoxide removed — not installed)
-# Zoxide integration (smart cd)
-if command -v zoxide >/dev/null; then
- eval "$(zoxide init zsh)"
-fi
+# ═══════════════════════════════════════════════════════════════════════════════
+# GNU COREUTILS (interactive-only PATH)
+# ═══════════════════════════════════════════════════════════════════════════════
-# Add this section to your .zshrc after the tool integrations section
+# Prevent GMP and other formulae from breaking by keeping gnubin off build PATH.
+# Only activate in interactive shells.
+if [[ $- == *i* ]]; then
+ export PATH="/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH"
+fi
# ═══════════════════════════════════════════════════════════════════════════════
# NODE VERSION MANAGEMENT
diff --git a/shell/aliases.zsh b/shell/aliases.zsh
index 3a6f812..ef6710b 100644
--- a/shell/aliases.zsh
+++ b/shell/aliases.zsh
@@ -4,7 +4,7 @@
alias gs='git status'
-alias kaicd='cd ~/Vault/08. Notes/Children/Kai'
+alias kaicd='cd "$VAULT_PATH/08. Notes/Children/02. Kai"'
## II. File checksum verification ##
alias verify1='openssl sha1'
@@ -76,20 +76,16 @@ alias afk="/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resource
# Access quicklook from terminal
alias ql="qlmanage -p "
-## Animal Rationis Capax
-# work session
-alias arc="cd /Users/davidglidden/Documents/GitHub/davidglidden.github.io && claude 'Context initialization:
-Please read these files in order:
-1. CLAUDE.md - Project instructions and workflow triggers
-2. docs/internal/collaboration-protocol.md - Our working relationship
-3. docs/internal/project-memory.md - Complete development history
-4. docs/chamber/workflow/MODE-1-UNIFIED.md - Current Chamber operations
-5. docs/style-guide.md - Editorial guidelines and notation system
+## CapableMind
+alias cm="cd ~/_Dev/CapableMind-AI"
+alias bmf="cd ~/_Dev/BetterMemories.io"
+alias bmf-health="curl -s http://localhost:3011/health | python3 -m json.tool"
+alias bmf-status="curl -s http://localhost:3011/health | python3 -c \"import sys,json;d=json.load(sys.stdin);cursors={k:v['cursor_position'] for k,v in d['modules'].items()};errors={k:v['error_count'] for k,v in d['modules'].items() if v['error_count']>0};print(f'Vector: {cursors[\\\"vector\\\"]} errors={d[\\\"modules\\\"][\\\"vector\\\"][\\\"error_count\\\"]}');print(f'Max cursor: {max(cursors.values())}');errors and print(f'Errors: {errors}')\""
+alias bmf-logs="tail -50 ~/.capablemind/logs/bmf.stderr.log"
+alias bmf-errors="grep -i 'error\|deferred\|circuit\|canary\|phase' ~/.capablemind/logs/bmf.stderr.log | tail -20"
-After reading, confirm you understand the current state and are ready for today'\''s work.'"
-
-# glimpse processing
-alias glimpse='cd ~/animal-davidglidden-eu/tools/glimpse-processing && source venv/bin/activate && python glimpse_tool.py'
+## Animal Rationis Capax
+alias arc="cd ~/_Dev/animal-davidglidden-eu"
## Tetris
alias tetris='/opt/homebrew/opt/vitetris/bin/tetris'
@@ -97,3 +93,9 @@ alias tetris='/opt/homebrew/opt/vitetris/bin/tetris'
## Pass license management shortcuts
alias licenses='pass ls licenses/'
alias license='pass show licenses/'
+
+
+
+## Obsidian Vault push to Gitea
+
+alias gitvault='~/bin/obsidian_vault_sync.sh'
diff --git a/shell/environment.zsh b/shell/environment.zsh
index 9ecc681..9b58e9b 100644
--- a/shell/environment.zsh
+++ b/shell/environment.zsh
@@ -25,8 +25,10 @@ export XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
# 📚 Vault and workspace paths
export VAULT_PATH="$HOME/Library/Mobile Documents/iCloud~md~obsidian/Documents/David, root-and-branch"
-export CHAMBER_PATH="$HOME/animal-davidglidden-eu"
-export WORK_PATH="$HOME/Documents/GitHub/davidglidden.github.io"
+export CHAMBER_PATH="$HOME/_Dev/chamber-library"
+export ARC_PATH="$HOME/_Dev/animal-davidglidden-eu"
+export CAPABLEMIND_PATH="$HOME/_Dev/CapableMind-AI"
+export BMF_PATH="$HOME/_Dev/BetterMemories.io"
export DOTFILES_PATH="$HOME/dotfiles"
# 🔧 Tool configurations
@@ -55,7 +57,9 @@ export GPG_TTY=$(tty)
# 🚀 Development context detection
detect_context() {
case "$PWD" in
- "$WORK_PATH"*) export CURRENT_CONTEXT="work" ;;
+ "$BMF_PATH"*) export CURRENT_CONTEXT="capablemind" ;;
+ "$CAPABLEMIND_PATH"*) export CURRENT_CONTEXT="capablemind" ;;
+ "$ARC_PATH"*) export CURRENT_CONTEXT="arc" ;;
"$CHAMBER_PATH"*) export CURRENT_CONTEXT="chamber" ;;
"$VAULT_PATH"*) export CURRENT_CONTEXT="vault" ;;
"$DOTFILES_PATH"*) export CURRENT_CONTEXT="dotfiles" ;;
diff --git a/shell/functions.zsh b/shell/functions.zsh
index fce1d65..78ec4fe 100644
--- a/shell/functions.zsh
+++ b/shell/functions.zsh
@@ -20,7 +20,7 @@ wttr() {
}
## III. Updates (system, brew, etc) #######################
-## Description: Performs system updates, Homebrew cleanup, fzf refresh, moon phase logging, and dotfile sync ###########################
+## Description: Performs system updates, Homebrew cleanup, moon phase logging, and dotfile sync ###########################
function sysupdate() {
local start_time=$(date +%s)
@@ -58,10 +58,7 @@ function sysupdate() {
echo "⚠️ mas not installed - install with: brew install mas"
fi
- echo "🔄 Refreshing fzf..."
- if [ -d ~/.fzf ]; then
- cd ~/.fzf && git pull && ./install --all && cd -
- fi
+ # fzf removed — no longer installed
# Fix Zsh completion security warnings
echo "🔒 Checking Zsh completion security..."
@@ -101,11 +98,11 @@ function sysupdate() {
echo "🌙 Moon phase tracking disabled (missing curl or jq)"
fi
- if [ -d "$HOME/.dotfiles" ]; then
+ if [ -d "$HOME/dotfiles" ]; then
echo "📝 Committing dotfile changes..."
- cd ~/.dotfiles || return
+ cd ~/dotfiles || return
git add . && git commit -m "🔧 Auto-commit from sysupdate on $(date '+%Y-%m-%d %H:%M')" && git push
- brew bundle dump --force --file="$HOME/.dotfiles/Brewfile"
+ brew bundle dump --force --file="$HOME/dotfiles/Brewfile"
cd - >/dev/null || return
fi
@@ -129,96 +126,76 @@ function quietupdate() {
sudo -vn 2>/dev/null || sudo -v
sudo softwareupdate -i -a >/dev/null
brew update >/dev/null && brew upgrade >/dev/null && brew cleanup >/dev/null && brew autoremove >/dev/null
- [ -d ~/.fzf ] && cd ~/.fzf && git pull >/dev/null && ./install --all >/dev/null && cd - >/dev/null
- [ -d "$HOME/.dotfiles" ] && cd ~/.dotfiles && git add . && git commit -m "auto sysupdate" && git push && brew bundle dump --force --file="$HOME/.dotfiles/Brewfile" && cd - >/dev/null
+ [ -d "$HOME/dotfiles" ] && cd ~/dotfiles && git add . && git commit -m "auto sysupdate" && git push && brew bundle dump --force --file="$HOME/dotfiles/Brewfile" && cd - >/dev/null
if [ -x "$HOME/.zsh/hooks/post-update" ]; then "$HOME/.zsh/hooks/post-update"; fi
osascript -e 'display notification "Quiet update complete!" with title "System Maintenance"'
}
# ═══════════════════════════════════════════════════════════════════════════════
-# Man Page side-by-side viewer
+# Modern, workspace-aware man page viewer
+# - Kitty/tmux/iTerm split panes, syntax highlighting via bat
+# - Optional qman integration for interactive TOC/search
+# - Order-flexible + apropos search
# ═══════════════════════════════════════════════════════════════════════════════
-# Detailed Kitty diagnostic
-debug_kitty_launch() {
- echo "=== Kitty Launch Debugging ==="
-
- # Check basic remote control
- echo "1. Testing basic remote control:"
- kitty @ ls
- echo " Exit code: $?"
-
- # Test simple launch
- echo -e "\n2. Testing simple window launch:"
- kitty @ launch --type=window echo "Hello from new window"
- echo " Exit code: $?"
-
- # Test with bash -c
- echo -e "\n3. Testing bash -c launch:"
- kitty @ launch --type=window bash -c "echo 'Hello with bash -c'"
- echo " Exit code: $?"
-
- # Test overlay
- echo -e "\n4. Testing overlay:"
- kitty @ launch --type=overlay bash -c "echo 'Overlay test'; read -p 'Press enter to close'"
- echo " Exit code: $?"
-
- # Test with actual man command
- echo -e "\n5. Testing with man command:"
- kitty @ launch --type=window bash -c "man ls"
- echo " Exit code: $?"
-}
-
-# Test the absolute simplest case
-test_basic_split() {
- echo "Testing basic split with sleep..."
- kitty @ launch --location=vsplit sleep 5
- echo "Exit code: $?"
-}
-
-# Beautiful man pages in resizable split pane
man() {
if [[ $# -eq 0 ]]; then
- echo "Usage: man [section]"
- echo "Opens man page in resizable split pane (kitty/tmux) or new tab (iTerm)"
+ echo "Usage:"
+ echo " man [section]"
+ echo " man [section] "
+ echo " man ? # apropos search"
return 1
fi
-
- local cmd="$1"
- local section="${2:-}"
-
- # Verify man page exists
- if ! /usr/bin/man -w ${section:+$section} "$cmd" >/dev/null 2>&1; then
- echo "❌ No manual entry for '$cmd'${section:+ in section $section}"
- return 1
+
+ # Apropos mode
+ if [[ "$1" == "?" ]]; then
+ shift
+ /usr/bin/man -k "$@"
+ return
fi
-
- # Build the display command that stays open and adapts to terminal width
- local display_cmd
- local bat_path=$(which bat 2>/dev/null)
- if [[ -n "$bat_path" ]]; then
- # Use bat with terminal width detection and better wrapping
- display_cmd="export PATH=\"$PATH\"; export MANWIDTH=\$(tput cols); /usr/bin/man ${section:+$section} '$cmd' 2>/dev/null | col -bx | '$bat_path' --language=man --style=grid --theme=Nord --paging=always --terminal-width=\$(tput cols) --wrap=auto; echo; echo 'Press any key to close...'; read -k1"
+
+ # Support both orders: man 2 open OR man open 2
+ local cmd section
+ if [[ "$1" =~ ^[0-9]+$ && -n "$2" ]]; then
+ section="$1"; cmd="$2"
else
- # Fallback with responsive width
- display_cmd="export MANWIDTH=\$(tput cols); MANPAGER='less -R' /usr/bin/man ${section:+$section} '$cmd'; echo; echo 'Press any key to close...'; read -k1"
+ cmd="$1"; section="${2:-}"
fi
-
- # Handle different terminals - always use split/resizable approach
+
+ # Verify page exists
+ if ! /usr/bin/man -w ${section:+$section} -- "$cmd" >/dev/null 2>&1; then
+ echo "❌ No manual entry for '$cmd'${section:+ in section $section}"
+ echo "💡 Try: man ? $cmd"
+ return 1
+ fi
+
+ # Choose backend
+ local display_cmd
+ if command -v qman >/dev/null 2>&1; then
+ display_cmd="qman ${section:+$section }-- '$cmd'"
+ else
+ local bat_path; bat_path=$(command -v bat 2>/dev/null || true)
+ if [[ -n "$bat_path" ]]; then
+ display_cmd="export MANWIDTH=\$(tput cols); /usr/bin/man ${section:+$section} '$cmd' 2>/dev/null \
+ | col -bx \
+ | '$bat_path' --language=man --style=grid --theme=\${BAT_THEME:-Nord} \
+ --paging=always --terminal-width=\$(tput cols) --wrap=auto"
+ else
+ display_cmd="export MANWIDTH=\$(tput cols); MANPAGER='less -R' /usr/bin/man ${section:+$section} '$cmd'"
+ fi
+ fi
+
+ # Handle different terminal environments
if [[ -n "${KITTY_WINDOW_ID:-}" ]]; then
- # Kitty: Create optimally-sized vertical split
- # Left pane: ~100 chars for code, Right pane: ~64 chars for optimal reading
kitty @ launch \
--location=vsplit \
--title="📖 $cmd${section:+ ($section)}" \
--cwd=current \
- --bias=60 \
- zsh -c "$display_cmd" >/dev/null
+ --bias=${KITTY_BIAS:-60} \
+ zsh -lc "$display_cmd" >/dev/null
elif [[ -n "${TMUX:-}" ]]; then
- # TMUX: Create resizable horizontal split (easier to read)
- tmux split-window -v -l 40% "$display_cmd"
+ tmux split-window -v -l ${TMUX_HEIGHT:-40%} "$display_cmd"
elif [[ "${TERM_PROGRAM}" == "iTerm.app" ]]; then
- # iTerm: Create new split pane
osascript -e "
tell application \"iTerm\"
tell current window
@@ -230,17 +207,13 @@ man() {
end tell
end tell
end tell
- end tell
- " >/dev/null 2>&1
+ end tell" >/dev/null 2>&1
else
- # Fallback: run inline
echo "📖 Displaying man page inline:"
eval "$display_cmd"
fi
}
-# batman is already aliased to man in aliases.zsh
-
# ═══════════════════════════════════════════════════════════════════════════════
# DOTFILES MANAGEMENT FUNCTIONS
# ═══════════════════════════════════════════════════════════════════════════════
@@ -297,12 +270,81 @@ backup-configs() {
echo " ✓ GPG configuration"
fi
- # AWS credentials (if they exist)
- if [[ -d ~/.aws ]]; then
- cp -R ~/.aws "$backup_dir/" 2>/dev/null || true
- echo " ✓ AWS configuration"
- fi
-
echo "✅ Configs backed up to: $backup_dir"
}
+# ═══════════════════════════════════════════════════════════════════════════════
+# LICENSE MANAGEMENT FUNCTIONS FOR PASS
+# ═══════════════════════════════════════════════════════════════════════════════
+
+# License management: add a license entry with optional attached file
+license-add() {
+ if [ $# -lt 1 ]; then
+ echo "Usage: license-add [license-file-path]"
+ return 1
+ fi
+
+ local product="$1"
+ local entry="licenses/$product"
+ local dir="$HOME/.password-store/${entry}.gpg.d"
+
+ echo "→ Paste activation code or license metadata for '$product', then press Ctrl+D:"
+ pass insert -m "$entry" || return 1
+
+ if [ $# -eq 2 ]; then
+ local filepath="$2"
+ local filename="$(basename "$filepath")"
+ mkdir -p "$dir"
+ gpg -o "$dir/${filename}.gpg" -e -r "$(gpg --list-secret-keys --with-colons | awk -F: '/^uid:/ {print $10; exit}')" "$filepath"
+ echo "✔️ Encrypted license file saved as: $dir/${filename}.gpg"
+ else
+ echo "✔️ Code-only license entry created for '$product'."
+ fi
+}
+
+
+# Edit a license entry in the pass store
+license-edit() {
+ if [ $# -ne 1 ]; then
+ echo "Usage: license-edit "
+ return 1
+ fi
+
+ local product="$1"
+ pass edit "licenses/$product"
+}
+
+# List all stored licenses
+license-list() {
+ pass ls licenses/ | sed 's/^licenses\///' | sort
+}
+
+# Show license details and attached files for a product
+license-info() {
+ if [ $# -ne 1 ]; then
+ echo "Usage: license-info "
+ return 1
+ fi
+
+ local product="$1"
+ local entry="licenses/$product"
+ local pass_file="$HOME/.password-store/${entry}.gpg"
+ local attach_dir="$HOME/.password-store/${entry}.gpg.d"
+
+ if [ ! -f "$pass_file" ]; then
+ echo "❌ No license entry found for '$product'"
+ return 1
+ fi
+
+ echo "🔐 License entry: $product"
+ echo "----------------------------------------"
+ pass show "$entry"
+ echo
+
+ if [ -d "$attach_dir" ]; then
+ echo "📎 Attached encrypted file(s):"
+ find "$attach_dir" -type f -name '*.gpg' -exec basename {} \;
+ else
+ echo "📎 No attached files."
+ fi
+}
\ No newline at end of file
diff --git a/shell/nvm.zsh b/shell/nvm.zsh
index 50f0f2a..c29a540 100644
--- a/shell/nvm.zsh
+++ b/shell/nvm.zsh
@@ -28,8 +28,6 @@ nvm() {
# Aliases for when you need to use nvm
alias nvm-load='unset -f nvm; [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"'
alias nvm-claude='nvm use 22.16.0'
-alias node-homebrew='/opt/homebrew/bin/node'
-alias npm-homebrew='/opt/homebrew/bin/npm'
# Quick check if we're in a project with .nvmrc
check_nvmrc() {
diff --git a/shell/paths.zsh b/shell/paths.zsh
index 879c502..3c1734f 100644
--- a/shell/paths.zsh
+++ b/shell/paths.zsh
@@ -20,7 +20,6 @@ declare -a potential_paths=(
"/usr/local/bin" # Homebrew (Intel)
"/usr/local/sbin" # System binaries
"/opt/homebrew/opt/python@3.13/libexec/bin" # Python 3.13
- "/opt/homebrew/opt/python@3.12/libexec/bin" # Python 3.12 (fallback)
"$HOME/.cargo/bin" # Rust binaries
"/opt/homebrew/opt/gnu-sed/libexec/gnubin" # GNU sed
"/opt/homebrew/opt/gnu-tar/libexec/gnubin" # GNU tar
diff --git a/ssh/config b/ssh/config
index 2792db2..1e34851 100644
--- a/ssh/config
+++ b/ssh/config
@@ -8,3 +8,9 @@ Host github.com
User git
IdentityFile ~/.ssh/dfg_GH
IdentitiesOnly yes
+
+Host git.skemantix.com
+ HostName git.skemantix.com
+ User git
+ IdentityFile ~/.ssh/chamber-library
+ IdentitiesOnly yes