Commit Graph

1301 Commits

Author SHA1 Message Date
3d6f13b2bc tmux-net: always prefix local IP with home symbol
Show ⌂ before the local IP whether or not a VPN is up. The VPN branch
already prefixes ⌂; the non-VPN branch was emitting the bare IP.
2026-05-17 03:58:11 -07:00
e2a1e3b784 tmux status: use short hostname (#h) instead of FQDN (#H) 2026-05-17 03:23:55 -07:00
e38a6b3166 tmux status: show VPN IP when tunnel is active
Add tmux-vpn-ip helper (parses ifconfig for utun* on macOS, falls back
to tun/wg/ppp on Linux) and a tmux-net wrapper that conditionally
emits "⌂ <local> / ⇡ <vpn>" when a VPN tunnel is up, or just "<local>"
when it's not. status-right now calls tmux-net.
2026-05-17 03:19:26 -07:00
467b967ced tmux-ip: portable local-IP fallback for macOS
`hostname -I` is GNU-only and errors on BSD/macOS, so when the public-IP
curl couldn't reach api.ipify.org the script printed nothing and the
tmux status bar showed an empty IP. Try `ipconfig getifaddr` for common
interfaces first, fall back to `hostname -I` on Linux, then `ifconfig`
as a last resort. Also guard against empty-but-zero-exit curl output.
2026-05-17 03:12:11 -07:00
474fdd028c Rakefile: handle non-interactive stdin in ask()
STDIN.gets returns nil when stdin is closed/EOF (e.g. after vim/vundle
runs during install), causing `nil.chomp` to abort rake install during
install_term_theme. Return nil from ask() on EOF and have callers bail
out of the iTerm theme prompts gracefully.
2026-05-17 02:14:29 -07:00
a45f89b187 .claude/settings.json: prune server-specific entries; consolidate redundant ones
The previous snapshot of settings.json was a verbatim dump from one
Mastodon-server install — it carried allowlist entries that won't
match anywhere else and a lot of narrow rules already subsumed by
broader wildcards.

Removed (server-specific, dead weight on other hosts):
- /home/mastodon/* paths and Mastodon .env.production sed/chmod/chown
- signers.online and auto.signers.online curl/openssl probes
- mastodon-web / mastodon-streaming / mastodon-sidekiq journalctl
- n8n journalctl, windmill journalctl + binary
- /usr/local/bin/fail2ban-ignoreip and the hardcoded IP 76.95.82.63
- nslookup signers.live, nginx site-availables grep with literal paths
- /var/log/nginx/access.log* zcat probes (path-specific)
- StatusReactions / status_quoted grep over Mastodon's frontend tree

Removed (redundant, covered by broader wildcard already in the list):
- All narrow Bash(systemctl <verb>:*) entries — Bash(systemctl:*) covers
- All narrow Bash(git ...) entries — Bash(git:*) covers
- All narrow Bash(curl ...) probes — Bash(curl:*) covers
- Bash(rkhunter --update), Bash(rkhunter --propupd) — Bash(rkhunter:*) covers
- Bash(sysctl -a) — Bash(sysctl:*) covers

Kept: tmux/git/curl/sudo/find/ls/cat plus generic system-admin verbs
(systemctl, sysctl, crontab, iptables, ufw, firewall-cmd, fail2ban-client,
apt/apt-get/dpkg, mount, netstat, openssl, lsmod, last, nginx, redis-cli,
rkhunter, aideinit, getent, sqlite3, dig, ulimit, getenforce, aa-status)
plus Read(//home/**), Read(//opt/**), Read(//etc/nginx/sites-{enabled,available}/**).

Net: 5004 -> 1434 bytes (57 lines), still valid JSON, behavior on a
fresh host is identical for the kept verbs and tighter for the dropped
ones (host-specific allows just won't match anything anyway).

If you re-run install.sh on this host, the slim version replaces the
fat one; the fat one survives in ~/.drunkendotfiles.bak.<ts>/ for
recovery.
2026-05-06 10:10:21 +00:00
1b60a9364d Add portable Claude Code config
Saves ~/.claude/settings.json (user-level prefs + Bash/Read permissions
allowlist) so the same Claude Code config can be replicated on other
hosts via install.sh.

What gets deployed:
- .claude/settings.json — theme, verbose, defaultMode, skipAutoPermissionPrompt
  and the cumulative "approve once" allowlist for common ops (systemctl,
  iptables, journalctl, git, curl, etc.). Server-specific allow entries
  (e.g. /home/mastodon/* paths) are dead weight elsewhere but harmless.
- .claude/.gitignore — explicit deny-list so a future `git add .claude`
  doesn't accidentally pull in credentials, session logs, project
  memories, file-history, telemetry, caches, or settings.local.json.

What is NOT tracked (by design):
- .credentials.json (auth)
- history.jsonl, sessions/, projects/ (chat data, project memories)
- settings.local.json (per-machine overrides — by Claude Code convention)
- file-history/, plans/, paste-cache/, shell-snapshots/, session-env/,
  telemetry/, downloads/, cache/, backups/, mcp-needs-auth-cache.json
- plugins/ (marketplace install paths are absolute and host-specific)

deploy_dir's merge semantics mean: on a host that already has
~/.claude/.credentials.json or ~/.claude/projects/, those stay untouched
because the repo doesn't track them. Only the files we explicitly
include get installed.

Existing settings.json on the target host is moved aside to
~/.drunkendotfiles.bak.<timestamp>/ before being replaced.
2026-05-06 10:06:36 +00:00
5208e9a5bb install.sh: repoint dangling claude symlink to latest installed version
The committed ~/.local/bin/claude symlink targets a specific Claude Code
version path (whatever was current when this snapshot was taken). On any
host that has Claude Code installed at a different version, that symlink
arrives dangling.

Old behavior: just delete the dangling link and rely on the Claude
installer to recreate it. That doesn't help when the host has Claude
installed but at a version other than the one in the snapshot, and we
also support skipping the installer via DRUNKENDOTFILES_SKIP_CLAUDE=1
(used when the binary is already on disk but at a different version).

New behavior: when the deployed symlink is dangling, scan
~/.local/share/claude/versions/ and repoint the symlink to the highest
installed version (semver sort). Only fall back to deleting the link if
no version is installed at all.
2026-05-06 09:45:52 +00:00
6188583ee9 tmux: enable truecolor + focus-events for TUI apps
- Switch default-terminal from screen-256color to tmux-256color
  (better italics/undercurl/SGR support for nvim, Claude Code, etc.)
- Add terminal-features RGB for the common outer terminals so
  truecolor escape sequences pass through cleanly
- Enable focus-events so inner programs can redraw when the pane
  regains focus
2026-05-06 09:37:20 +00:00
f27ba2710e Pin git identity to dissimulo / connect+gitea@dustin-williams.com
Identity was previously deferred to ~/.gitconfig.user via the include
at the bottom of this file. Per the dotfiles owner, identity should
travel with the dotfiles regardless of host or local user — every
machine where this repo is deployed commits as dissimulo.

Per-machine bits (safe.directory, etc.) still belong in
~/.gitconfig.user, which the existing [include] at the bottom picks
up after this block.
2026-05-06 02:26:08 -07:00
c0e4a88d70 Add ~/.local/bin to PATH from prezto-override zshrc
The Claude Code installer drops the binary at ~/.local/bin/claude.
Without this PATH entry, freshly-installed Claude Code is invisible to
new shells until the user adds it manually. Other ~/.local/bin scripts
in this dotfiles repo (tmux-ip, tmux-window-icon, twitterbot, etc.)
benefit from the same.
2026-05-06 02:24:33 -07:00
700da3aa0b Make tmux/tmux.conf a relative symlink to ../.tmux.conf
YADR's Rakefile maps tmux/tmux.conf -> $HOME/.tmux.conf, but the
canonical, customized tmux config has lived at the repo root since
3d2508a (when the relationship was inverted). Re-running rake install
on its own (without the bash installer's subsequent personal-deploy
overlay) was therefore replacing the deployed real .tmux.conf with a
symlink to the older 3987-byte tmux/tmux.conf, dropping the IP/host
status-right and the bumped history limit.

Pointing tmux/tmux.conf at ../.tmux.conf via a relative symlink fixes
this on any machine, regardless of where ~/.yadr lives or which user
owns it: rake install's symlink chain now resolves to the customized
config no matter the install order.
2026-05-06 02:24:32 -07:00
fb80b6dfb2 gitconfig: use absolute include path for .gitconfig.user
The previous `[include] path = .gitconfig.user` was resolved relative to
the config file being read, which — because `~/.gitconfig` is a symlink
to `~/.yadr/git/gitconfig` — meant git looked for the user-identity
override at `~/.yadr/git/.gitconfig.user` instead of the conventional
`~/.gitconfig.user`. Switch to an absolute path so the include picks up
the homedir file regardless of symlink layout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 07:41:12 -07:00
1d7df94a1d install.sh: merge PERSONAL_DIRS contents instead of wholesale replace
The previous deploy_one() did `mv $HOME/<dir> $BACKUP_DIR/<dir>` then
`cp -a $YADR_DIR/<dir> $HOME/<dir>` for every entry in PERSONAL_DIRS.
For dirs the repo only partially populates (notably .local — repo only
tracks .local/bin/), this swept away unrelated user data: the most
recent re-bootstrap moved ~/.local/share/fonts/ (Intel One Mono, Open
Gorton, Roboto Mono, GALLAUDET, code128) into the timestamped backup,
making them appear missing.

Rework deploy logic:
- deploy_file: copies one file/symlink, backing up only the conflicting
  destination (if any). Idempotent via paths_equivalent() so re-runs
  with no changes produce no output and no spurious backups.
- deploy_dir: walks the repo's tree for that dir and deploys each leaf
  via deploy_file. Files in $HOME the repo doesn't know about are left
  untouched. Subdirs are mkdir'd as needed.

Also: track the personal fonts at .local/share/fonts/ so they redeploy
on every install, and run fc-cache -f at the end so apps see them
without a logout/login.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 07:28:40 -07:00
065686f341 spam-ascii: "*" dumps entire ~/ascii; alias quotes $0 to preserve it
Some checks failed
Close stale issues / stale (push) Has been cancelled
2026-04-22 07:00:52 -07:00
079bee5774 spam-ascii: pass -L to find so it dereferences ~/ascii when symlinked
Some checks failed
Close stale issues / stale (push) Has been cancelled
~/ascii is a symlink to ~/.yadr/ascii. Without -L, 'find <symlink>'
treats the link itself as the starting point, -type f rules it out,
and fuzzy matches return nothing.
2026-04-21 10:01:08 -07:00
4813512731 spam-ascii: fuzzy-match helper for /spam alias
New .local/bin/spam-ascii POSIX shell script: resolves a pattern to
a file in ~/ascii with this order:

  1. exact filename match
  2. exact name + common ASCII-art extension (.txt/.ans/.asc)
  3. first case-insensitive substring match (sorted alphabetically)

Non-zero exit + stderr-ish error if nothing matches, so /spam
prints 'no match in ~/ascii for: <pattern>' instead of spewing
a missing-file error.

Rewire the irssi /spam alias to call the script instead of
hardcoding 'cat ~/ascii/$0'. Now:

  /spam mario     -> matches ~/ascii/mario.txt or ~/ascii/Mario_art.ans
  /spam MARIO     -> case-insensitive
  /spam nothere   -> 'no match in ~/ascii for: nothere'
2026-04-21 09:48:40 -07:00
7b47e38f53 Add ascii art collection 2026-04-21 09:41:46 -07:00
a6c2b5de40 irssi/config: add /spam alias — cat file from ~/ascii to channel
/spam <name> runs 'cat ~/ascii/<name>' via EXEC -out, which sends
each line of output as a message to the current channel/query. Good
for posting ASCII art.

Usage: /spam <filename>  (file lives at ~/ascii/<filename>)
2026-04-21 09:32:48 -07:00
4ca7f9714d rainbow-dark: drop rainbow dashes, add rainbow-timestamp.pl
- rainbow-dark.theme: revert line_start back to the stock '-!-' pattern.
- .irssi/scripts/autorun/rainbow-timestamp.pl: new autorun script that
  hooks 'print text', matches a leading HH:MM[:SS], and reruns it
  through rainbow.pl's make_colors (same palette [4,8,9,11,12,13],
  same 2-char stride, same phase-advance on each line). The result
  is that every successive timestamp is a 5-character rainbow
  gradient that also shifts starting colour line-to-line.
2026-04-21 09:27:03 -07:00
2dbc05bc0b irssi/config: revert active theme to rainbow-dark 2026-04-21 09:21:24 -07:00
dcde950329 Add claude.theme (ports Claude Code's default dark palette)
claude.theme: a dark irssi theme whose colours map 1:1 to the roles
Claude Code uses in its default dark UI:

  #8c8c8c  dim        timestamps, brackets, connective text
  #f85149  red        errors, netsplits, parts, private msg frames
  #56d364  green      joins, ctcp, dcc, netjoins, quiet activity
  #e3b341  yellow     messages-to-me, /me, statusbar chatter
  #4a9eff  blue       channel names, pubnicks, diff-style accents
  #c9a3ff  magenta    own nick / prompt / notices / hilights
  #4ec9b0  cyan       whois field names, info lines

Uses 24-bit true-colour escapes (%z<rrggbb>) so the shades land
exactly regardless of terminal palette. Requires irssi 1.2+ and a
truecolour-capable terminal (modern xterm/tmux both are).

irssi/config: switch the active theme from rainbow-dark to claude.
2026-04-21 09:15:42 -07:00
92b9e0ec99 irssi: dynamic-nick.pl — set default nick to `|<hostname> at startup
Autorun script so the same drunkendotfiles deploy gives each host a
distinctive nick without per-host config hand-edits. Trims FQDNs to
the short hostname before composing. Static 'nick = "`"' in
config stays as a fallback if the script ever fails to load.
2026-04-21 09:07:09 -07:00
6f86285f71 irssi/config: set nick to backtick 2026-04-21 09:05:54 -07:00
eac005ad3c irssi/config: activate rainbow-dark as the default theme 2026-04-21 09:05:18 -07:00
c5ccf351de rainbow-dark: line_start uses ROYGBIV (7 colours)
R-Y-G-C-B-M was only six. Full spectrum now: red, orange (%y dark
yellow, renders brown-orange on most terminals), yellow, green,
blue, indigo (%b dark blue as the closest ANSI indigo), violet
(%M bright magenta). Stays ANSI-only so it renders reliably
regardless of 24-bit truecolor support.
2026-04-21 09:01:20 -07:00
1d4d454434 rainbow-dark: reset to default.theme + minimal rainbow
Scrap the over-engineered version. Start from irssi's default theme
(already dark-safe) and apply rainbow only where it actually earns
its keep:

- line_start: the leading '-!-' on non-message lines gets a full
  R-Y-G-C-B-M dash sequence instead of blue-blue.
- sb_act_msg: drop the %W (white) on statusbar activity — on a dark
  terminal this was the one stark-white glyph. Re-colour the whole
  activity band as a rainbow escalation: %G (quiet) -> %Y (chatter)
  -> %R (hilight), so urgency tracks the colour.
- sb_act_sep: comma separator drops to %K (dark grey) so the rainbow
  entries stand apart.

Everything else stays untouched from default.theme. No invented
24-bit escapes, no format overrides.
2026-04-21 08:59:13 -07:00
99049754f9 rainbow-dark: swap teal accent for diff-style blue (#4a90e2)
Teal wasn't landing; try diff-header blue instead. Same %z<rgb>
24-bit foreground mechanism, just a different colour value.
2026-04-21 08:54:54 -07:00
415ee5028c rainbow-dark: %z not %Z (lowercase is fg, uppercase is bg)
Previous commit used %Z005f5f, which irssi 1.4 interprets as a
24-bit *background* colour. That rendered as 'teal background
behind each affected character' — easy to miss on short glyphs,
invisible on whitespace. Foreground is %z (lowercase).
2026-04-21 08:52:06 -07:00
92c4f0bdc1 rainbow-dark: use 24-bit true-colour #005f5f for the teal accent
Earlier pass tried %X17 (256-palette idx 23), but %X isn't the
256-colour code in modern irssi — 1.4+ treats %X as a no-op for
unknown sequences, so every intended teal element was silently
falling through to the terminal default (= bright white).

irssi 1.4.5 supports %Z<rrggbb> for 24-bit foreground colour, so
use it directly: %Z005f5f renders as exactly #005f5f (dark teal),
no palette guessing.
2026-04-21 08:50:08 -07:00
6314406506 rainbow-dark: swap dark-grey accents for very dark bluish-teal
Every %K (dark grey / bright-black) swapped for %X17 — 256-colour
foreground 0x17 == palette index 23, RGB #005f5f, a very dark
teal/cyan. Applies to: body text, bracket/punctuation replaces,
message-body dim, connective text in join/part/quit/etc. formats,
dccfile name, whois values, servernotice body, wallop body.

Requires a 256-colour-capable terminal; irssi renders %X17 as
palette 23 when the terminal advertises 256 colour support (most
modern terminals do — .tmux.conf already sets TERM=screen-256color).
2026-04-21 08:44:27 -07:00
50449d73c4 rainbow-dark: more aggressive darkening
- Body text color bumped from %w (light grey, sometimes renders ~white)
  to %K (dark grey / 'bright black'), affecting msgnick and all action
  templates.
- Statusbar / info bg changed from %8 (terminal default, which some
  terminals render as reverse-video white) to explicit %0 (black) so
  the bar is reliably dark everywhere.
- Added color to spots that were falling through to terminal default:
  whois values, servernotice body, wallop_nick, wallop_action body,
  dccfile.
- Expanded 'fe-common/core' formats block to override joins, parts,
  quits, kicks, nick/topic/mode changes, aways etc. — coloured nicks
  via the existing abstracts but the surrounding 'has joined' /
  'changed the topic' verbiage now renders in dim grey instead of
  stark white.
2026-04-21 08:36:05 -07:00
6bbe277ea9 rainbow-dark: less white in message bodies; irssi: /wN window aliases
rainbow-dark.theme:
- Message body text now tinted dim grey (%w) instead of inheriting
  terminal-default (usually stark white) — done via a trailing %w in
  the msgnick template.
- Own nick in public, private, and DCC contexts switches from bold
  white (%W) to bold bright magenta (%M) so 'you' stays distinct but
  stops looking like every other bright-white element.
- Action bodies (public, private, DCC) get the same %w dim-grey tint.

.irssi/config: add W1..W99 aliases so /w1, /w2, ... /w99 jump
directly to that window (pair to the existing bare numeric /1 /2
aliases, for users whose muscle memory has 'w' in it).
2026-04-21 08:25:38 -07:00
af13d65e7d zsh/theme.zsh: drop ruby version from right prompt
Blank RPROMPT after prompt skwp loads so the right side stays clean.
2026-04-21 08:19:34 -07:00
45fc664976 zsh/theme.zsh: restore prezto fpath before loading skwp prompt
The skwp prompt's precmd calls git-info and ruby-info (prezto module
functions that live in ~/.zprezto/modules/{git,ruby}/functions). On
interactive shell startup, something — likely compinit's
insecure-directory pruning when parent dirs are group-writable —
strips those paths from $fpath after pmodload seeded them.

When precmd then references the autoload-declared-but-unfindable
functions, zsh fails to locate the definition file, aborts the
prompt render midway through, and zsh-syntax-highlighting latches
onto the broken half-prompt. Observed symptoms:

  prompt_skwp_precmd: git-info: function definition file not found
  prompt_skwp_precmd: ruby-info: function definition file not found
  zsh: bad math expression: operand expected at '%F{135}%n%...'
  _zsh_highlight_call_widget:2: bad math expression: operand...

Defensive re-seed: before calling 'prompt skwp', prepend the helper,
git, and ruby module function dirs to $fpath if they aren't already
present. Idempotent, cheap, and masks any upstream stripping
regardless of cause.
2026-04-21 08:17:21 -07:00
62add4988d install.sh: install Claude Code if not already present
Adds a step after personal-dotfile deploy that runs Anthropic's
official one-liner installer (curl -fsSL https://claude.ai/install.sh | bash)
when no 'claude' binary is found. No-ops if claude is already on the
machine. Opt out with DRUNKENDOTFILES_SKIP_CLAUDE=1. Install failures
are non-fatal — the rest of the flow still completes.

README: document the new step + the opt-out env var + curl in the
required tools list.
2026-04-21 08:08:12 -07:00
1e39d19ab2 Ensure Prezto submodule is initialized on clone/install
install.sh: use --recurse-submodules on the initial clone, and always
run 'git submodule update --init --recursive' before rake install so a
fresh checkout doesn't leave zsh/prezto empty.

README: document --recurse-submodules for manual clones; mention the
recovery command for existing shallow clones.

Fixes: bad math expression errors and 'no such file or directory:
~/.zprezto/runcoms/zshrc' on fresh shell startup when the Prezto
submodule hadn't been initialized.
2026-04-21 08:06:07 -07:00
e455702f01 Add rainbow-dark irssi theme
Dark-background theme with a full rainbow of accent colors for nicks,
statusbar items, and event markers.

Activate with:
  /set theme rainbow-dark
  /save
2026-04-21 07:58:46 -07:00
23e3c770dd README: add Upgrading section (pull, rake update, install.sh) 2026-04-21 07:49:38 -07:00
bcbb88bddc README: lowercase dissimulo to match handle 2026-04-21 07:29:34 -07:00
18ddfc9ad6 tmux-ip: fix DO metadata path (address -> ip_address)
The DigitalOcean metadata endpoint for reserved/floating IPv4 is
/metadata/v1/{reserved,floating}_ip/ipv4/ip_address, not .../address.
The .../active check works but the wrong IP path returned an empty
body, causing the script to silently fall through to ipify on every
droplet with a reserved/floating IP attached.

Verified on a droplet:
  curl .../reserved_ip/ipv4/ip_address -> 45.55.111.240
  curl .../reserved_ip/ipv4/address    -> (empty)
2026-04-21 07:20:51 -07:00
129d77471b tmux-ip: prefer DigitalOcean reserved/floating IP when on a droplet
If /sys/class/dmi/id/sys_vendor says DigitalOcean and the droplet has
a reserved_ip or floating_ip assigned, use that over the ipify-based
egress IP. Keeps the ipify/hostname -I fallback intact for other hosts.

Gated on the DMI check so non-DO hosts skip the metadata probe entirely
and the tmux status bar refresh stays fast.
2026-04-21 07:10:13 -07:00
41fb30ddc1 Add drunkendotfiles installer and rewrite README
install.sh: curl-pipe installer that clones to ~/.yadr, runs YADR's
native rake install, then layers personal dotfiles on top of $HOME
with backups on collision.

README.md: replace YADR's upstream readme with drunkendotfiles-
specific usage docs, credit, and refresh-from-upstream instructions.
2026-04-21 06:51:13 -07:00
65f583fd2b Scrub hardcoded /home/dissimulo paths; use $HOME / relative symlinks
- Convert 21 absolute-path symlinks into YADR to relative paths
  (e.g. .vimrc -> .yadr/vimrc), so they resolve correctly under
  any user's $HOME after a standard YADR install.
- .fehbg: replace hardcoded background path with $HOME-based one
- .gtk-bookmarks: remove (trivially personal; GTK regenerates)
- .themes/*/index.theme: drop BackgroundImage= lines pointing at
  personal image files that other users won't have.
- .xscreensaver: scrub username from header comment.
- .irssi/config: generic dcc_download_path.
2026-04-21 06:48:06 -07:00
f4d8679398 Increase tmux history limit to 80000 2026-04-21 06:16:16 -07:00
852a682df5 Update claude binary 2026-04-21 06:16:16 -07:00
3d2508a785 Replace .tmux.conf symlink with real file; add IP to status-right, interval 60 2026-04-21 06:16:16 -07:00
0affdd1fb7 Add tmux-ip helper script with public/internal IP fallback 2026-04-21 06:16:16 -07:00
bc9f9d8094 Add dotfiles from home directory
Tracks shell configs (zsh/bash), vim, tmux, irssi, fonts, themes,
and ~/.local/bin scripts. Sensitive files (.ssh, .gnupg, history,
credentials) and large app data are excluded via .gitignore.
2026-04-21 06:16:16 -07:00
Luiz Gonzaga dos Santos Filho
bf3c24aa85 Merge pull request #893 from jasonwbarnett/jwb/fix-exists 2026-01-17 15:37:39 -08:00