Skip to content

herdr-app-themes - #105

Merged
edheltzel merged 2 commits into
masterfrom
herdr-app-themes
Nov 4, 2026
Merged

edheltzel merged 2 commits into
masterfrom
herdr-app-themes

Conversation

@edheltzel

Copy link
Copy Markdown
Owner

No description provided.

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Visual recap — skipped

The visual recap job did not run for this pull request. This is informational only and does not block the PR.

Recap skipped for 7d7ed0b: PLAN_RECAP_TOKEN not configured.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Two issues should be addressed before merging: the new Tuxedo settings file blocks config deployment on existing installations, and the captured terminal history publishes personal account metadata.

Reviewed changes across both commits, including Herdr desktop theme integration and the accompanying application configuration changes.

  • Herdr desktop themes: Adds Dracula and Eldritch palettes and integrates settings updates plus live app.theme commands into the theme switcher.
  • Application defaults: Selects Eldritch across multiple tools, changes terminal font preferences to Obel Mono, and updates Herdr search, ligatures, telemetry, and sidebar settings.
  • Deployment workflow: Documents theme linking and manual cross-machine configuration distribution, with a corresponding task reminder.
  • Runtime files: Adds Tuxedo settings and Herdr session snapshots, updates session selection, and captures terminal scrollback.

Validation: Bash syntax, ShellCheck error-level checks, and JSON/palette checks passed. An isolated GNU Stow dry run reproduced the deployment conflict. macOS application rendering and live reload were not exercised in this Linux environment.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using gpt-6.1-sol | 𝕏

@@ -0,0 +1 @@
theme = Eldritch

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Tracking Tuxedo settings blocks config deployment

On an existing installation with a regular ~/.config/tuxedo/config.toml, adding this file makes Stow abort the entire config package rather than install the new Herdr theme links. I reproduced this even when the existing file contained exactly the same theme = Eldritch setting.

Technical details
# Preserve app-owned Tuxedo settings

## Affected sites
- config/.config/tuxedo/config.toml:1 introduces a Stow target that already exists as an app-owned regular file.
- config/AGENTS.md:17 explicitly keeps this file app-owned and untracked.
- config/.config/theme-switcher/theme-switcher.sh:677-703 already updates the live settings file while preserving other settings.

## Evidence
GNU Stow 2.3.1, running --simulate against the actual config package and an isolated target with .config/tuxedo/config.toml, reported:

```text
WARNING! stowing config would cause conflicts:
  * existing target is neither a link nor a directory: .config/tuxedo/config.toml
All operations aborted.
```

## Required outcome
- Existing Tuxedo installations can stow the config package without deleting or adopting their personal settings.
- Keep the Tuxedo themes tracked, but remove the app-owned config.toml from the package and ignore it to prevent accidental recapture; active-theme selection can remain in update_tuxedo.

"1": {
"ansi": "\r\n\u001b[0m\u001b[38;2;0;162;206m⚡︎~\u001b[0m \r\n\r\n\u001b[0m\u001b[38;2;0;162;206m⚡︎~\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;2;11;139;0m\u001b[0m \r\n\r\n\u001b[0m\u001b[38;2;0;162;206m⚡︎~\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;2;11;139;0m\u001b[0m ",
"lines": 8
"ansi": "\r\n\u001b[0m\u001b[38;2;0;162;206m⚡︎~\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;2;11;139;0m\u001b[0m \u001b[0m\u001b[1mtuxedo \u001b[0m\u001b[38;2;142;140;161m󰔛 10ms\u001b[0m\r\ntuxedo: todo.txt\r\n\r\n\u001b[0m\u001b[38;2;0;162;206m⚡︎~\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;2;11;139;0m\u001b[0m \u001b[0m\u001b[1ml \u001b[0m\u001b[38;2;142;140;161m󰔛 5s310ms\u001b[0m\r\n\u001b[0m\u001b[4mName\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.agents\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.aws\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.bun\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.bundle\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.cache\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.cargo\u001b[0m\r\n\u001b[0m\u001b[38;5;6m .claude\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6mDeveloper/atlas-config/claudecode/\u001b[0m\u001b[1m\u001b[38;5;4m.claude\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.codegraph\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.codeium\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.codex\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.composer\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.config\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.cua-driver\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.cups\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.cursor\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.cursor-tutor\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.dbclient\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.degit\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.dendron\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.deque\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.docker\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.dotfiles\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.dotfiles-backups\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.dropbox\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.embedded-postgres-go\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.empryo\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.fnm\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.fzf\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.gap\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.gem\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.gemini\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.gitkraken\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.gk\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.gnupg\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.gnupg_pre_2.1\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.go\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.grok\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.grokbot\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.kiro\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.local\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.localcerts\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.mjolnir\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.no-mistakes\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.node\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.node-gyp\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.npm\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.ollama\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.omp\u001b[0m\r\n\u001b[0m\u001b[38;5;6m .pi\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6mDeveloper/atlas-config/pi-agent/\u001b[0m\u001b[1m\u001b[38;5;4m.pi\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.pnpm-state\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.pnpm-store\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.rbenv\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.rustup\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.sourcegraph-psql\u001b[0m\r\n\u001b[0m\u001b[38;5;4m󰢬 \u001b[0m\u001b[1m\u001b[38;5;4m.ssh\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.subversion\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.supermaven\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.terminfo\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.tldrc\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.Trash\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.vim\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.vite-plus\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.vscode\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.vscode-insiders\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.wallpapers\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.windsurf\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m.yarn\u001b[0m\r\n\u001b[0m\u001b[38;5;6m Applications\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m/\u001b[0m\u001b[1m\u001b[38;5;4mApplications\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mArtcraft\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4m'Creative Cloud Files Personal Account ed@rainyday.media B0856FC2526FF2870A490D44@AdobeID'\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mDesktop\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mdev\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mDeveloper\u001b[0m\r\n\u001b[0m\u001b[38;5;4m󰲂 \u001b[0m\u001b[1m\u001b[38;5;4mDocuments\u001b[0m\r\n\u001b[0m\u001b[38;5;4m󰉍 \u001b[0m\u001b[1m\u001b[38;5;4mDownloads\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mgo\u001b[0m\r\n\u001b[0m\u001b[38;5;6m 'Google Drive'\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m/Users/ed/Library/CloudStorage/\u001b[0m\u001b[1m\u001b[38;5;4mGoogleDrive-ed@rainyday.media\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mLibrary\u001b[0m\r\n\u001b[0m\u001b[38;5;4m󰿎 \u001b[0m\u001b[1m\u001b[38;5;4mMovies\u001b[0m\r\n\u001b[0m\u001b[38;5;4m󱍙 \u001b[0m\u001b[1m\u001b[38;5;4mMusic\u001b[0m\r\n\u001b[0m\u001b[38;5;4m󰉏 \u001b[0m\u001b[1m\u001b[38;5;4mPictures\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mProjects\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mPublic\u001b[0m\r\n\u001b[0m\u001b[38;5;6m scripts\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6mDeveloper/atlas-config/claudecode/\u001b[0m\u001b[1m\u001b[38;5;4mscripts\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mSites\u001b[0m\r\n\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mterminals\u001b[0m\r\n\u001b[0m\u001b[38;5;6m .ackrc\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.ackrc\r\n .authy.json\r\n .authycache.json\r\n󱆃 .bash_history\r\n󱆃 .bashrc\r\n\u001b[0m\u001b[38;5;6m .biome.json\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.biome.json\r\n .CFUserTextEncoding\r\n .claude.json\r\n .claude.json.backup\r\n .copilot-cli-access-token\r\n .copilot-cli-copilot-token\r\n .dendron.uuid\r\n .DS_Store\r\n .fzf.zsh\r\n\u001b[0m\u001b[38;5;6m .gemrc\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.gemrc\r\n󰊢 .gitconfig\r\n\u001b[0m\u001b[38;5;6m .gitconfig.local\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m/Users/ed/.dotfiles/git/\u001b[0mgitconfig-macdaddy.local\r\n\u001b[0m\u001b[38;5;6m󰊢 .gitignore_global\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/git/\u001b[0m\u001b[1m\u001b[38;5;2m.gitignore_global\u001b[0m\r\n\u001b[0m\u001b[38;5;6m .gitnow\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.gitnow\r\n\u001b[0m\u001b[38;5;6m .hushlogin\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.hushlogin\r\n .lesshst\r\n .node_repl_history\r\n\u001b[0m\u001b[38;5;6m .npmrc\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.npmrc\r\n\u001b[0m\u001b[38;5;6m󱆃 .profile\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.profile\r\n .python_history\r\n .raycast-google-drive-sqlite.db\r\n\u001b[0m\u001b[38;5;6m .stow-global-ignore\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.stow-global-ignore\r\n .tig_history\r\n\u001b[0m\u001b[38;5;6m .tigrc\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.tigrc\r\n\u001b[0m\u001b[38;5;6m󱁻 .tmux.conf\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.tmux.conf\r\n .viminfo\r\n .wget-hsts\r\n\u001b[0m\u001b[38;5;6m .wgetrc\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/dots/\u001b[0m.wgetrc\r\n .yarnrc\r\n .zcompdump\r\n󱆃 .zsh_history\r\n\u001b[0m\u001b[38;5;6m󱆃 .zshenv\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m.dotfiles/zsh/\u001b[0m.zshenv\r\n todo.txt\r\n\r\n\u001b[0m\u001b[38;2;0;162;206m⚡︎~\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;2;11;139;0m\u001b[0m \u001b[0m\u001b[38;2;142;140;161m󰔛 4s450ms\u001b[0m",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Captured scrollback publishes personal account metadata

The new ansi payload contains a full home-directory listing, including an Adobe account identifier and personal cloud-storage account paths. Merging it publishes that runtime output in this public repository even though none of it is needed for theme configuration.

Technical details
# Exclude captured terminal history

## Affected sites
- config/.config/herdr/session-history.json:10 replaces a short prompt-only history with a complete directory-listing capture.

## Required outcome
- Remove the newly captured personal terminal output from this PR.
- Keep runtime session-history.json out of version control so normal terminal use cannot be accidentally included in configuration commits; retain the local runtime file when removing it from the index.
- Do not reproduce the captured account identifiers in documentation or review replies.

…itcher

- add herdr-app/themes/dracula.json and eldritch.json
- theme-switcher: update_herdr_app writes settings.json and applies app.theme live
- theme-switcher README: document the herdr-app step
@edheltzel
edheltzel merged commit 38ef167 into master Nov 4, 2026
2 of 5 checks passed
@edheltzel
edheltzel deleted the herdr-app-themes branch November 4, 2026 21:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant