Skip to content

Replace zsh/OMZ with Starship prompt#7

Merged
drewjs merged 9 commits intomainfrom
topic/starship
Mar 18, 2026
Merged

Replace zsh/OMZ with Starship prompt#7
drewjs merged 9 commits intomainfrom
topic/starship

Conversation

@drewjs
Copy link
Owner

@drewjs drewjs commented Mar 18, 2026

Summary

  • Remove stow-managed zsh/ package (.zshrc, .zsh_profile)
  • Add starship/ stow package with starship.toml config
  • Clean ~/.zshrc now lives outside dotfiles (Starship, no OMZ, no p10k)

Test plan

  • New terminal opens with Starship prompt
  • fnm, fzf, pnpm, aliases, keybindings all work
  • Shell startup ~0.13s

🤖 Generated with Claude Code

Drop Oh-My-Zsh, Powerlevel10k, and the stow-managed zsh package.
Shell config now lives at ~/.zshrc (untracked) with Starship prompt.
Add starship/ stow package for managed starship.toml.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 18, 2026

PR Review: Replace zsh/OMZ with Starship prompt

Overall this is a clean simplification — removing ~130 lines of mostly-commented OMZ boilerplate is a clear win, and the starship/ package follows the repo's stow conventions correctly.

A few things worth addressing:


Bug: $directory rendered twice

format = "$directory$all"

$all is a shorthand that expands to all enabled modules in their default order, including $directory. This means the directory segment will appear twice in the prompt — once explicitly, then again inside $all.

To fix, either list only the modules you want explicitly, or just rely on $all and reorder via module-level config. A common approach if you just want directory first:

format = "$directory$git_branch$git_status$nodejs$golang$lua$character"

Or use $all without the explicit $directory:

format = "$all"
# directory will appear in its default position within $all

Keybindings and aliases are now untracked

The old zsh/.zsh_profile held:

bindkey -s ^f "tmux-sessionizer\n"

And .zshrc had gc, pn, px, co, nvmrc aliases, fzf config, and presumably fnm setup. The PR description notes the new .zshrc "lives outside dotfiles" — that's a deliberate call, but it means shell environment setup is no longer reproducible from this repo alone. Worth considering whether a minimal zsh/.zshrc stub (or at least a template) should be tracked so a fresh machine knows what it needs.


CLAUDE.md not updated

The Key Tools section still lists:

zsh — shell config with Oh-My-Zsh, fzf, ripgrep

This should be updated to reflect Starship, and the stow example commands should include starship.


Minor

  • truncation_length = 18 on [git_branch] is quite short for branch names with ticket prefixes (e.g. feat/PROJ-1234-description). Consider bumping to 25–30 or leaving at the default (32).
  • [buf] is disabled — if you're not using buf regularly, no issue, just noting it's there.

The starship/ package structure itself is correct per the CLAUDE.md conventions. Once the format double-render bug is fixed and CLAUDE.md is updated, this looks good to merge.

drewjs and others added 2 commits March 17, 2026 17:54
Replace Rose Pine statusline.conf with catppuccin/tmux plugin.
Square separators, transparent bar bg, lavender active tab number,
surface_0 active tab text and module text bg, padded icons.
Switch Ghostty theme to Catppuccin Macchiato, remove bg opacity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 18, 2026

PR Review: Replace zsh/OMZ with Starship prompt

Overall this is a clean, well-motivated change. The Starship migration and tmux improvements are solid. A few things worth flagging:


Untracked ~/.zshrc — biggest concern

The PR description notes the new .zshrc "now lives outside dotfiles." This defeats a core purpose of a dotfiles repo. All the aliases, exports, keybindings, and tool inits (fnm, fzf, pnpm) that were in the old .zshrc are now unversioned.

Consider adding a zsh/.zshrc that's a clean, OMZ-free version. You already have starship/ as its own stow package — keeping zsh/ alongside it would round out the setup and make it reproducible on a new machine without manual reconstruction.


tmux changes

Good improvements:

  • tmux-256color over screen-256color is the right call for modern terminals
  • Extended keys (extkeys) for ghostty/xterm is a nice addition
  • Preserving pane_current_path on splits/new windows is a quality-of-life win
  • history-limit 50000 is a sensible bump

Potential issues:

  • escape-time 0: Setting this to 0 (from 1ms) can occasionally cause escape sequences to be misread in edge cases. 1ms was already imperceptibly fast; 0 is fine in practice but worth knowing if you ever see odd key behavior.

  • bind x kill-pane (no confirm): This replaces tmux's default kill-with-confirmation. Accidental prefix + x is an easy mistake and there's no undo for a pane with unsaved state. Consider bind X kill-pane (capital) if you want a fast kill but want to keep the guarded x.

  • bind -n S-Enter send-keys C-j: The -n makes this a global binding (no prefix required). Shift+Enter will send C-j in every pane — including editors, REPLs, etc. that may handle Shift+Enter distinctly. If this is specifically for a terminal workflow (e.g. sending to a REPL pane), a more targeted approach would avoid surprising behavior.

  • bind Enter split-window -v replaces bind - for vertical split — this is a breaking change from muscle memory but a reasonable choice. Just noting it's intentional.


Starship config

Clean and minimal. A couple of small notes:

  • format = "$directory$all" is correct — $all expands to modules not explicitly in format, so $directory won't double-render.
  • The [rust] module isn't explicitly configured but will appear by default when in a Rust project. If you want full control over which languages show, add disabled = true entries for any you don't want (like you did for [package] and [buf]).

Catppuccin tmux plugin (submodule)

Adding it as a git submodule is the right approach. Just make sure the repo's README/CLAUDE.md notes the git clone --recurse-submodules requirement (or a post-clone git submodule update --init) so setup on a new machine doesn't silently fail with a missing plugin.


Ghostty

Theme → Macchiato and opacity → 1 are purely aesthetic — no concerns there.


Summary: Approve with one recommendation: bring the new .zshrc back into version control as zsh/.zshrc, even if it's much simpler than the old one. The rest of the changes are improvements.

Replace zsh/OMZ and alacritty references with Starship and Ghostty.
Update stow package list and key tools section.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 18, 2026

PR Review

Overall this is a clean, well-scoped change. Migration from OMZ to Starship simplifies the shell config considerably, and the consistent Catppuccin Macchiato theming across ghostty/tmux/starship is a nice touch.

Observations and Questions

zsh/ removal

The deleted .zshrc contained aliases, fzf/ripgrep exports, and the tmux-sessionizer keybinding from .zsh_profile. The PR description mentions a clean ~/.zshrc now lives outside dotfiles. Worth noting in CLAUDE.md what moved there vs. what was intentionally dropped, so future-you knows this was deliberate.

tmux submodule

The catppuccin/tmux plugin is added as a git submodule, but CLAUDE.md setup instructions do not mention running submodule init after cloning. New installs will have an empty plugins directory and a broken tmux statusline.

Suggestion -- add to the CLAUDE.md Setup section:

git submodule update --init --recursive

tmux.conf -- extended keys

The xterm* glob in terminal-features will not match tmux-256color (the new default-terminal). Consider also adding:

set -as terminal-features 'tmux-256color:extkeys'

This may explain any keybinding edge cases with Ghostty.

catppuccin.conf -- window path display

pane_current_path can produce very long paths in the statusline. The basename format (#{b:pane_current_path}) is worth considering if it gets cramped -- purely aesthetic.

Summary

Two concrete things worth addressing:

  1. Add git submodule update --init --recursive to the CLAUDE.md setup steps.
  2. Consider whether the terminal-features extkeys glob needs a tmux-256color entry alongside xterm*.

Everything else looks solid.

drewjs and others added 3 commits March 18, 2026 08:24
Re-adds zsh/.zshrc to dotfiles after OMZ→Starship migration.
Secrets are split into ~/.zshrc.local (untracked) sourced at runtime.
Includes .zshrc.local.example as new-machine setup template.
Also makes the `cl` alias portable via $HOME.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The plugin was tracked as a gitlink (mode 160000) without a .gitmodules
file, causing fresh clones to get an empty directory and a broken tmux
statusline. Removed the submodule gitlink and added the plugin files as
regular tracked files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 18, 2026

PR Review: Replace zsh/OMZ with Starship prompt

Overall this is a solid cleanup — removing OMZ reduces shell startup time dramatically and Starship is a great fit for a minimal, fast prompt. A few things worth discussing:


Vendored catppuccin/tmux plugin (main concern)

The bulk of this PR (+2,400 lines) is the entire catppuccin/tmux plugin committed directly under tmux/.config/tmux/plugins/catppuccin/tmux/. This brings in things that don't belong in a personal dotfiles repo:

  • .github/ issue templates, release workflows, CI configs
  • A full test suite (run_tests.sh, etc.)
  • Binary assets: assets/basic.gif, assets/frappe.webp, assets/config*.png — these are just the upstream README screenshots
  • CHANGELOG.md, CONTRIBUTING.md, upstream LICENSE

Suggested alternatives:

  1. Git submodule — tracks a pinned upstream commit, easy to update with git submodule update:

    git submodule add https://github.com/catppuccin/tmux tmux/.config/tmux/plugins/catppuccin/tmux
  2. TPM (Tmux Plugin Manager) — installs/manages plugins outside the dotfiles repo entirely, similar to how lazy.nvim handles Neovim plugins.

  3. Shallow clone in setup script — a one-liner in a bootstrap.sh or the README that clones only what's needed at install time.

Any of these avoids carrying upstream CI infra and binary blobs in the dotfiles history.


Stale .gitignore entry

+zsh/.zshrc.local

The zsh/ package is being removed in this PR, so this ignore rule is dead on arrival. Safe to drop.


.zshrc living outside dotfiles

The PR summary notes the clean ~/.zshrc intentionally lives outside the repo. That's a valid choice, but it's worth documenting in CLAUDE.md or the README so there's a reference for what the expected shell config looks like when setting up a new machine. Otherwise the setup instructions (stow bin ghostty nvim skhd starship tmux yabai) silently leave shell initialization uncovered.


starship.toml — looks good

The config is minimal and intentional. A couple of small observations:

  • format = "$directory$all" puts directory first which is fine, but $all will include every enabled module. Since you've explicitly disabled [package] and [buf], any newly-installed language tool (rust, python, etc.) will auto-appear. That may be intentional.
  • truncate_to_repo = false on [directory] means you'll see full paths in deep monorepos — intentional given how you likely navigate with tmux-sessionizer.

catppuccin.conf — looks clean

The tmux config is well-structured with clear comments separating pre-run options from post-run layout. The # reset leftover styles from previous configs (Rose Pine remnants) comment is helpful context for future-you but could be removed once it's confirmed things are stable.


Summary: The actual config changes (starship, ghostty theme, tmux status bar) are solid. The main thing I'd address before merging is the vendored plugin — it's ~95% of the diff and the cleanest fix is a git submodule.

drewjs and others added 2 commits March 18, 2026 09:08
Replace broken gitlink with a proper submodule entry. Pins to
v2.1.3 (b2f219c), the same commit previously referenced.

  git submodule update --init

on fresh clone populates the plugin.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 18, 2026

PR Review - Replace zsh/OMZ with Starship prompt.

Good cleanup overall. Removing OMZ and p10k cuts significant startup overhead, and the secrets separation via .zshrc.local is a clear improvement.

BUG: alias gk uses a non-existent git command. git kill is not a standard command and will error. This is likely meant to be: alias gk=git branch | fzf | xargs git branch -d

OBSERVATION 1 - Hardcoded Apple Silicon Homebrew path: /opt/homebrew is ARM-only. Intel Macs use /usr/local. The autosuggestions and syntax-highlighting sources will silently fail on Intel hardware. Fine for M-series only setup, but worth a note in CLAUDE.md.

OBSERVATION 2 - bind x kill-pane removes confirmation: Overrides the default confirm-before behavior. Easy to accidentally close the wrong pane.

OBSERVATION 3 - Submodule not documented in setup: Fresh clones need git submodule update --init before the tmux statusline works. Missing from CLAUDE.md setup section.

OBSERVATION 4 - PR description vs final state: The summary says .zshrc now lives outside dotfiles, but the final commit re-adds zsh/.zshrc to the stow package. The stow install command in CLAUDE.md is also missing zsh.

POSITIVES: Shell startup at ~0.13s is a solid win. source fzf --zsh is the modern approach. .zshrc.local.example bootstrap template is a great pattern. pane_current_path on splits is a quality-of-life win. history-limit 50000 and escape-time 0 are solid improvements.

@drewjs drewjs merged commit 71a3d35 into main Mar 18, 2026
1 check passed
@drewjs drewjs deleted the topic/starship branch March 18, 2026 19:40
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