<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Avinash Seethalam</title>
    <description>The latest articles on DEV Community by Avinash Seethalam (@avinash431).</description>
    <link>https://dev.to/avinash431</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3898593%2F6809101e-2ef9-4462-9473-8d6d51649985.png</url>
      <title>DEV Community: Avinash Seethalam</title>
      <link>https://dev.to/avinash431</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avinash431"/>
    <language>en</language>
    <item>
      <title>Building a Complete Developer Terminal Setup for Claude Code — Part 6: Dotfiles and Wrap-up</title>
      <dc:creator>Avinash Seethalam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 11:55:31 +0000</pubDate>
      <link>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-6-dotfiles-and-wrap-up-54c0</link>
      <guid>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-6-dotfiles-and-wrap-up-54c0</guid>
      <description>&lt;p&gt;&lt;em&gt;By Avinash, GenAI Practice Lead | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj"&gt;Part 2&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38"&gt;Part 3&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044"&gt;Part 4&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-5-terminal-environment-184h"&gt;Part 5&lt;/a&gt; | Part 6 of 6&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;A setup you can't reproduce is a setup you'll eventually lose. Hard drives fail, Macs get replaced, and without a dotfiles repo everything built in this series disappears with them. This final part covers packaging everything into a maintainable dotfiles repo and wrapping up the series.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dotfiles Repo
&lt;/h2&gt;

&lt;p&gt;A dotfiles repo is a version-controlled collection of your configuration files. The goal is simple: clone the repo on a new machine, follow the checklist, and have a fully configured environment in under an hour.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/dotfiles
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/dotfiles
git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy all configuration files in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude/hooks
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.claude/statusline.sh .claude/statusline.sh
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.claude/hooks/notify-stop.sh .claude/hooks/notify-stop.sh
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.claude/hooks/notify-permission.sh .claude/hooks/notify-permission.sh
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.claude/settings.json .claude/settings.json

&lt;span class="c"&gt;# Terminal&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.tmux.conf .tmux.conf
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.zshrc .zshrc

&lt;span class="c"&gt;# Starship&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .config
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.config/starship.toml .config/starship.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit and push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial dotfiles — Claude Code, tmux, starship, zsh"&lt;/span&gt;
gh repo create dotfiles &lt;span class="nt"&gt;--private&lt;/span&gt; &lt;span class="nt"&gt;--source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  File Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotfiles/
├── README.md
├── .tmux.conf
├── .zshrc
├── .config/
│   └── starship.toml
└── .claude/
    ├── settings.json
    ├── statusline.sh
    └── hooks/
        ├── notify-stop.sh
        └── notify-permission.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Fresh Machine Checklist
&lt;/h2&gt;

&lt;p&gt;The README in the repo contains the full step-by-step setup guide. The checklist at the end covers every action in sequence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Install Homebrew&lt;/li&gt;
&lt;li&gt;[ ] Install core dependencies: &lt;code&gt;brew install git jq node fzf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Install iTerm2 and set JetBrains Mono Nerd Font&lt;/li&gt;
&lt;li&gt;[ ] Set terminal type to &lt;code&gt;xterm-256color&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Import tokyo-night color theme&lt;/li&gt;
&lt;li&gt;[ ] Install &lt;code&gt;zsh-autosuggestions&lt;/code&gt; and &lt;code&gt;zsh-syntax-highlighting&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Install fzf and run key bindings setup&lt;/li&gt;
&lt;li&gt;[ ] Install starship and apply tokyo-night preset&lt;/li&gt;
&lt;li&gt;[ ] Install tmux and clone tpm&lt;/li&gt;
&lt;li&gt;[ ] Copy &lt;code&gt;.tmux.conf&lt;/code&gt; and install plugins with &lt;code&gt;Ctrl+B I&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Install Claude Code&lt;/li&gt;
&lt;li&gt;[ ] Copy &lt;code&gt;.claude/settings.json&lt;/code&gt;, &lt;code&gt;statusline.sh&lt;/code&gt;, and hook scripts&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;chmod +x&lt;/code&gt; the statusline and hook scripts&lt;/li&gt;
&lt;li&gt;[ ] Add plugin marketplaces in Claude Code&lt;/li&gt;
&lt;li&gt;[ ] Install all 9 plugins and reload&lt;/li&gt;
&lt;li&gt;[ ] Verify plugin counts: 9 plugins · 35 skills · 18 agents · 10 hooks · 2 plugin MCP servers · 1 plugin LSP server&lt;/li&gt;
&lt;li&gt;[ ] Verify claude-mem worker at &lt;code&gt;http://localhost:37777&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Test sound notifications with &lt;code&gt;afplay&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Test statusline with mock JSON input&lt;/li&gt;
&lt;li&gt;[ ] Create tmux sessions and save layout with &lt;code&gt;Ctrl+B Ctrl+S&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;If I were starting this setup from scratch with the knowledge I have now, I'd install &lt;code&gt;claude-mem&lt;/code&gt; and &lt;code&gt;pyright-lsp&lt;/code&gt; on day one. They have the highest ongoing return of anything in the stack — persistent memory and real-time type checking compound in value over time in a way that one-time tools don't.&lt;/p&gt;

&lt;p&gt;I'd also build the statusline earlier. Flying blind on token usage and rate limits for the first weeks of Pro plan use cost me more than the hour it took to write the script.&lt;/p&gt;

&lt;p&gt;The one thing I'd skip entirely is trying to get visual notification banners working. &lt;code&gt;osascript&lt;/code&gt; and &lt;code&gt;terminal-notifier&lt;/code&gt; are both unreliable on macOS Sequoia. &lt;code&gt;afplay&lt;/code&gt; is the right answer and I should have gone there first.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;iTerm2 + tokyo-night&lt;/td&gt;
&lt;td&gt;True color, Nerd Font support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiplexer&lt;/td&gt;
&lt;td&gt;tmux + resurrect&lt;/td&gt;
&lt;td&gt;Persistent sessions, 3-pane layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt&lt;/td&gt;
&lt;td&gt;Starship tokyo-night&lt;/td&gt;
&lt;td&gt;Git, Python, time at a glance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shell&lt;/td&gt;
&lt;td&gt;zsh + autosuggestions + fzf&lt;/td&gt;
&lt;td&gt;Faster command entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI IDE&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Primary development tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Statusline&lt;/td&gt;
&lt;td&gt;Custom bash script&lt;/td&gt;
&lt;td&gt;Real-time token/cost/rate limit visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;afplay&lt;/code&gt; sound notifications&lt;/td&gt;
&lt;td&gt;Async task completion awareness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins&lt;/td&gt;
&lt;td&gt;9 curated plugins&lt;/td&gt;
&lt;td&gt;Code review, memory, type checking, workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config&lt;/td&gt;
&lt;td&gt;Private dotfiles repo&lt;/td&gt;
&lt;td&gt;Reproducible setup in under an hour&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Series
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8"&gt;Part 1 — The Problem and Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.tolink-to-part-2"&gt;Part 2 — Custom Statusline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38"&gt;Part 3 — Sound Notification Hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044"&gt;Part 4 — Plugin Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-5-terminal-environment-184h"&gt;Part 5 — Terminal Environment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 6 — Dotfiles and Wrap-up &lt;em&gt;(this article)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All scripts and configuration files are at &lt;a href="https://github.com/ai-with-avinash/claude-code-best-setup" rel="noopener noreferrer"&gt;https://github.com/ai-with-avinash/claude-code-best-setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you build on this setup or find improvements, I'd genuinely like to know — leave a comment or open a PR on the dotfiles repo.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>cli</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building a Complete Developer Terminal Setup for Claude Code — Part 5: Terminal Environment</title>
      <dc:creator>Avinash Seethalam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 11:48:59 +0000</pubDate>
      <link>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-5-terminal-environment-184h</link>
      <guid>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-5-terminal-environment-184h</guid>
      <description>&lt;p&gt;&lt;em&gt;By Avinash, GenAI Practice Lead | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj"&gt;Part 2&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38"&gt;Part 3&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044"&gt;Part 4&lt;/a&gt; | Part 5 of 6&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The terminal environment around Claude Code matters as much as Claude Code itself. You spend hours in this environment — the less friction it has, the more thinking you can direct at the actual work.&lt;/p&gt;

&lt;p&gt;This part covers everything outside Claude Code: iTerm2, tmux, starship, fzf, and zsh plugins.&lt;/p&gt;




&lt;h2&gt;
  
  
  iTerm2
&lt;/h2&gt;

&lt;p&gt;Replace macOS Terminal with iTerm2. The reasons that matter for this setup specifically are true 24-bit color rendering (ANSI color gradients in the statusline render correctly), better escape code support (the blinking compaction warning needs this), and mouse support in tmux.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; iterm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two settings to configure immediately after installing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Font&lt;/strong&gt; — install JetBrains Mono Nerd Font for starship icons and powerline segments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; font-jetbrains-mono-nerd-font
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in iTerm2: &lt;strong&gt;Settings → Profiles → Text → Font&lt;/strong&gt; → set to &lt;code&gt;JetBrainsMono Nerd Font&lt;/code&gt;, size 13.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal type&lt;/strong&gt; — in iTerm2: &lt;strong&gt;Settings → Profiles → Terminal → Report Terminal Type&lt;/strong&gt; → set to &lt;code&gt;xterm-256color&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Color theme&lt;/strong&gt; — download and import the tokyo-night theme:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; ~/Downloads/tokyo-night.itermcolors &lt;span class="s2"&gt;"https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/iterm/tokyonight_night.itermcolors"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;strong&gt;Settings → Profiles → Colors → Color Presets → Import&lt;/strong&gt; → select the file → apply.&lt;/p&gt;




&lt;h2&gt;
  
  
  tmux
&lt;/h2&gt;

&lt;p&gt;tmux is a terminal multiplexer. For Claude Code development the value is twofold: persistent sessions that survive terminal restarts, and multiple panes visible simultaneously without switching tabs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;tmux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My standard 3-pane layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────┬──────────────┐
│                     │  Logs/Watch  │
│    Claude Code      ├──────────────┤
│                     │     Git      │
└─────────────────────┴──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code runs in the large left pane. Test output or log watching runs top right. Git and manual commands run bottom right. Everything visible at once — no tab switching mid-flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Essential config&lt;/strong&gt; — add to &lt;code&gt;~/.tmux.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; mouse on              &lt;span class="c"&gt;# trackpad scrolling&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; history-limit 50000   &lt;span class="c"&gt;# large scrollback buffer&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-sg&lt;/span&gt; escape-time 0        &lt;span class="c"&gt;# no delay for escape key — important for Claude Code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Session persistence&lt;/strong&gt; — install tmux-resurrect and tmux-continuum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to &lt;code&gt;~/.tmux.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @plugin &lt;span class="s1"&gt;'tmux-plugins/tpm'&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @plugin &lt;span class="s1"&gt;'tmux-plugins/tmux-resurrect'&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @plugin &lt;span class="s1"&gt;'tmux-plugins/tmux-continuum'&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @continuum-restore &lt;span class="s1"&gt;'on'&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @resurrect-capture-pane-contents &lt;span class="s1"&gt;'on'&lt;/span&gt;
run &lt;span class="s1"&gt;'~/.tmux/plugins/tpm/tpm'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press &lt;code&gt;Ctrl+B then I&lt;/code&gt; inside tmux to install plugins. Save layout with &lt;code&gt;Ctrl+B then Ctrl+S&lt;/code&gt;. After this, closing iTerm2 and reopening it restores your exact layout — pane positions, working directories, and running processes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Starship Prompt
&lt;/h2&gt;

&lt;p&gt;The default macOS prompt tells you almost nothing. Starship shows git branch, git status, Python version, and time directly in your prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;ocr-eval-framework on  main [x!?] via 🐍 v3.12.9  18:43
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;[x!?]&lt;/code&gt; git status indicators: &lt;code&gt;x&lt;/code&gt; = staged changes, &lt;code&gt;!&lt;/code&gt; = unstaged modifications, &lt;code&gt;?&lt;/code&gt; = untracked files. At a glance you know your exact repo state without running &lt;code&gt;git status&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;starship
starship preset tokyo-night &lt;span class="nt"&gt;-o&lt;/span&gt; ~/.config/starship.toml
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(starship init zsh)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  fzf
&lt;/h2&gt;

&lt;p&gt;fzf replaces linear &lt;code&gt;Ctrl+R&lt;/code&gt; command history search with an interactive fuzzy finder. Type any fragment of a previous command and it filters in real time across your entire history. For long evaluation commands with specific flags you ran three sessions ago, this is invaluable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;fzf
&lt;span class="si"&gt;$(&lt;/span&gt;brew &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/opt/fzf/install  &lt;span class="c"&gt;# say y to all three prompts&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three shortcuts now available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+R&lt;/code&gt; — fuzzy search command history&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+T&lt;/code&gt; — fuzzy search files, paste path to prompt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Alt+C&lt;/code&gt; — fuzzy search directories and cd into selected&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  zsh Plugins
&lt;/h2&gt;

&lt;p&gt;Two additions that change daily terminal use immediately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;zsh-autosuggestions&lt;/strong&gt; shows previous commands in grey as you type based on history. Right arrow to accept the suggestion. After a day of use your muscle memory adapts and you stop retyping long paths from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;zsh-syntax-highlighting&lt;/strong&gt; colors commands green (valid) or red (invalid) as you type. Catches typos before you press Enter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;zsh-autosuggestions zsh-syntax-highlighting
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Full Visual Stack
&lt;/h2&gt;

&lt;p&gt;With everything configured, your terminal looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark navy tokyo-night background in iTerm2&lt;/li&gt;
&lt;li&gt;JetBrains Mono Nerd Font rendering icons cleanly&lt;/li&gt;
&lt;li&gt;tmux status bar at the bottom showing session name and time&lt;/li&gt;
&lt;li&gt;Starship prompt showing directory, git branch, git status, Python version&lt;/li&gt;
&lt;li&gt;Claude Code statusline above the prompt showing tokens, cost, rate limits&lt;/li&gt;
&lt;li&gt;Grey autosuggestions completing commands as you type&lt;/li&gt;
&lt;li&gt;Green/red syntax highlighting on every command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every layer of information has a deliberate place. Nothing is decorative.&lt;/p&gt;




&lt;p&gt;All configuration files are at &lt;a href="https://github.com/ai-with-avinash/claude-code-best-setup" rel="noopener noreferrer"&gt;https://github.com/ai-with-avinash/claude-code-best-setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;← &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044"&gt;Back to Part 4&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-6-dotfiles-and-wrap-up-54c0"&gt;Continue to Part 6 → Dotfiles and Wrap-up&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>cli</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Building a Complete Developer Terminal Setup for Claude Code — Part 4: Plugin Stack</title>
      <dc:creator>Avinash Seethalam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 11:46:21 +0000</pubDate>
      <link>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044</link>
      <guid>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044</guid>
      <description>&lt;p&gt;&lt;em&gt;By Avinash, GenAI Practice Lead | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj"&gt;Part 2&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38"&gt;Part 3&lt;/a&gt; | Part 4 of 6&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Claude Code has a growing plugin ecosystem. The temptation is to install everything — more agents, more skills, more coverage. This is the wrong approach, especially on a Pro plan.&lt;/p&gt;

&lt;p&gt;Every plugin injects instructions into your session context at startup. A plugin with 38 agents and 156 skills adds a meaningful token overhead to every single session, whether you use those skills or not. On Pro where you're paying per input token, a bloated plugin stack is a recurring tax on every conversation.&lt;/p&gt;

&lt;p&gt;I installed, evaluated, and removed several plugins before settling on 9 that earn their place. Here's the final stack and the reasoning behind each.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 9 Plugins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;caveman&lt;/code&gt;&lt;/strong&gt; — strips filler from Claude's responses. No pleasantries, no hedging, just signal. The benchmarks show ~65% output token reduction on coding tasks. In practice the savings are real and the response style actually improves for tight coding loops — you get code and decisions, not explanations you didn't ask for. Activate with &lt;code&gt;/caveman&lt;/code&gt;, deactivate with &lt;code&gt;"normal mode"&lt;/code&gt; before switching to documentation or client-facing writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;claude-mem&lt;/code&gt;&lt;/strong&gt; — persistent memory across sessions. This is the most impactful plugin in the stack. Without it every Claude Code session starts completely blank — no knowledge of what you built yesterday, no context on architectural decisions made last week. With it, the session opens with a compressed summary of relevant past work injected automatically. For multi-week projects this eliminates the re-establishment overhead that quietly consumes 10-15 minutes of every session. It runs a background worker on port 37777 with a web viewer for your observation history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;code-review&lt;/code&gt;&lt;/strong&gt; — 5 parallel Sonnet agents reviewing your code before pushes. Covers CLAUDE.md compliance, bug detection, historical context, PR history, and code comments simultaneously. Trigger with &lt;code&gt;/code-review&lt;/code&gt; after any meaningful change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;pr-review-toolkit&lt;/code&gt;&lt;/strong&gt; — deeper review covering tests, error handling, type design, code quality, and simplification. Use this before anything that goes into a production codebase or published whitepaper. Run with &lt;code&gt;/pr-review-toolkit:review-pr all&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;feature-dev&lt;/code&gt;&lt;/strong&gt; — three-agent workflow for new features: explore codebase → architect solution → review quality. Reserve it for moments where you'd naturally step back and think about design before writing code. Overkill for bug fixes, well-suited for new model wrappers or evaluation dimensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;commit-commands&lt;/code&gt;&lt;/strong&gt; — auto-generates meaningful commit messages from staged changes. Replaces the cognitive overhead of writing commit messages at the end of a long session when you're tired and just want to push.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;context7&lt;/code&gt;&lt;/strong&gt; — pulls current SDK documentation into context automatically when you're working with external libraries. When your code references a LiteLLM function or a Boto3 call, context7 fetches the current docs rather than relying on Claude's training data which may be stale on specific SDK versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;taches-cc-resources&lt;/code&gt;&lt;/strong&gt; — a collection of workflow commands worth knowing: &lt;code&gt;/create-plans&lt;/code&gt; for structured project planning with PLAN.md, &lt;code&gt;/debug-like-expert&lt;/code&gt; for systematic debugging with evidence gathering, and &lt;code&gt;/ask-me-questions&lt;/code&gt; for requirement clarification before starting a large ambiguous task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;pyright-lsp&lt;/code&gt;&lt;/strong&gt; — Python language server via Pyright. Gives Claude real-time type errors, import resolution, and go-to-definition across your codebase. Without it Claude reads files reactively when something breaks. With it, it sees problems as they exist in your code continuously.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Removed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;everything-claude-code&lt;/code&gt;&lt;/strong&gt; — 38 agents, 156 skills, 72 legacy command shims. The context footprint is enormous and the coverage largely duplicates what the targeted plugins above already handle. Removed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing the Stack
&lt;/h2&gt;

&lt;p&gt;Add the marketplaces first — these commands run &lt;strong&gt;inside a Claude Code session&lt;/strong&gt;, not in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add anthropics/claude-code
/plugin marketplace add anthropics/claude-plugins-official
/plugin marketplace add glittercowboy/taches-cc-resources
/plugin marketplace add thedotmack/claude-mem
/plugin marketplace add JuliusBrussee/caveman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;code-review@claude-code-plugins
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;pr-review-toolkit@claude-code-plugins
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;feature-dev@claude-code-plugins
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;commit-commands@claude-code-plugins
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;context7@claude-plugins-official
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;pyright-lsp@claude-plugins-official
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;taches-cc-resources@taches-cc-resources
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;claude-mem@thedotmack
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;caveman@caveman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload with &lt;code&gt;/reload-plugins&lt;/code&gt;. Expected output: &lt;code&gt;9 plugins · 35 skills · 18 agents · 10 hooks · 2 plugin MCP servers · 1 plugin LSP server&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;caveman&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/caveman&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All coding sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-mem&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Always on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;code-review&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/code-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Before any meaningful push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pr-review-toolkit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/pr-review-toolkit:review-pr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Before production or published code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;feature-dev&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/feature-dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;New features requiring design thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;commit-commands&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/commit-commands:commit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;context7&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Working with external SDKs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;taches-cc-resources&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/create-plans&lt;/code&gt;, &lt;code&gt;/debug-like-expert&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Planning and complex debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pyright-lsp&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Always on for Python projects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;← &lt;a href="https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38"&gt;Back to Part 3&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-5-terminal-environment-184h"&gt;Continue to Part 5 → Terminal Environment&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building a Complete Developer Terminal Setup for Claude Code — Part 3: Sound Notification Hooks</title>
      <dc:creator>Avinash Seethalam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 11:40:26 +0000</pubDate>
      <link>https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38</link>
      <guid>https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38</guid>
      <description>&lt;p&gt;&lt;em&gt;By Avinash, GenAI Practice Lead | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj"&gt;Part 2&lt;/a&gt; | Part 3 of 6&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The problem is simple: Claude Code finishes a task while you're reading documentation, reviewing a PR, or staring out the window. You have no idea it's done. You check back 5 minutes later to find it waiting. Multiply this across a full workday and the lost time adds up significantly.&lt;/p&gt;

&lt;p&gt;The solution is a sound notification. Hear the sound, look at the screen. Simple.&lt;/p&gt;

&lt;p&gt;Getting there was less simple than I expected.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Tried First
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;osascript&lt;/code&gt;&lt;/strong&gt; is the standard macOS approach for sending notifications from bash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osascript &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'display notification "Task completed" with title "Claude Code ✅" sound name "Hero"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On macOS Sequoia this runs silently and does nothing. No error, no notification. Apple tightened notification sandboxing in recent versions and &lt;code&gt;osascript&lt;/code&gt; notifications now require Script Editor to be registered in System Settings → Notifications — and on many machines it never appears there at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;terminal-notifier&lt;/code&gt;&lt;/strong&gt; is the community-standard alternative:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;terminal-notifier
terminal-notifier &lt;span class="nt"&gt;-title&lt;/span&gt; &lt;span class="s2"&gt;"Claude Code ✅"&lt;/span&gt; &lt;span class="nt"&gt;-message&lt;/span&gt; &lt;span class="s2"&gt;"Task completed"&lt;/span&gt; &lt;span class="nt"&gt;-sound&lt;/span&gt; &lt;span class="s2"&gt;"Hero"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Apple Silicon Macs running Sequoia, &lt;code&gt;terminal-notifier&lt;/code&gt; 2.0.0 sends no notification and produces no error. After removing Gatekeeper quarantine flags with &lt;code&gt;sudo xattr -dr com.apple.quarantine&lt;/code&gt;, trying the &lt;code&gt;.app&lt;/code&gt; bundle path directly, and verifying the binary location — still nothing. The package is effectively broken on modern macOS.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Works
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;afplay&lt;/code&gt; is a macOS command-line audio player. It ships with every Mac, requires zero setup, and plays system sounds reliably:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;afplay /System/Library/Sounds/Hero.aiff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No notification banner. Just sound. And for the actual use case — knowing when Claude is done without watching the screen — sound alone is sufficient. You're already in the terminal when you care about the visual output.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Hooks
&lt;/h2&gt;

&lt;p&gt;Claude Code fires hooks on specific events. I set up two hook scripts covering three scenarios:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task complete&lt;/strong&gt; (&lt;code&gt;Stop&lt;/code&gt; event) → &lt;strong&gt;Hero sound&lt;/strong&gt;&lt;br&gt;
The most important hook. Fires when Claude finishes responding. Deep tone, clearly distinct from system sounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permission needed&lt;/strong&gt; (&lt;code&gt;permission_prompt&lt;/code&gt;) → &lt;strong&gt;Glass sound&lt;/strong&gt;&lt;br&gt;
Fires when Claude needs your approval before proceeding. Higher pitch, slightly urgent. You hear this and know you need to look at the screen and make a decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Awaiting input&lt;/strong&gt; (&lt;code&gt;idle_prompt&lt;/code&gt;) → &lt;strong&gt;Ping sound&lt;/strong&gt;&lt;br&gt;
Fires when Claude is waiting for your next message. Softer, lower priority.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;notify-permission.sh&lt;/code&gt; script reads the &lt;code&gt;notification_type&lt;/code&gt; field from the JSON payload using &lt;code&gt;jq&lt;/code&gt; to distinguish between &lt;code&gt;permission_prompt&lt;/code&gt; and &lt;code&gt;idle_prompt&lt;/code&gt; and play the appropriate sound.&lt;/p&gt;


&lt;h2&gt;
  
  
  Wiring Up the Hooks
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Stop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash ~/.claude/hooks/notify-stop.sh"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Notification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"permission_prompt|idle_prompt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash ~/.claude/hooks/notify-permission.sh"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also add the hook scripts to the permissions allow list so Claude Code doesn't prompt for approval every time they run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Bash(bash ~/.claude/hooks/notify-stop.sh)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Bash(bash ~/.claude/hooks/notify-permission.sh)"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hooks only activate for new sessions — restart Claude Code after updating &lt;code&gt;settings.json&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing the Sounds
&lt;/h2&gt;

&lt;p&gt;Before wiring up the hooks, verify all three sounds play on your machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;afplay /System/Library/Sounds/Hero.aiff
afplay /System/Library/Sounds/Glass.aiff
afplay /System/Library/Sounds/Ping.aiff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If any of these don't play, check System Settings → Sound → Output volume. &lt;code&gt;afplay&lt;/code&gt; respects system volume but is not affected by Do Not Disturb.&lt;/p&gt;




&lt;p&gt;Both hook scripts are at &lt;a href="https://github.com/ai-with-avinash/claude-code-best-setup" rel="noopener noreferrer"&gt;https://github.com/ai-with-avinash/claude-code-best-setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;← &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj"&gt;Back to Part 2&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044"&gt;Continue to Part 4 → Plugin Stack&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>claudecode</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Building a Complete Developer Terminal Setup for Claude Code — Part 2: Custom Statusline</title>
      <dc:creator>Avinash Seethalam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 10:31:31 +0000</pubDate>
      <link>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj</link>
      <guid>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj</guid>
      <description>&lt;h1&gt;
  
  
  Building a Complete Developer Terminal Setup for Claude Code — Part 2: Custom Statusline
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;By Avinash, GenAI Practice Lead | &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8"&gt;Part 1&lt;/a&gt; | Part 2 of 6&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Note: This setup is macOS-specific.&lt;/strong&gt; All tools, commands, and configurations in this series are tested on macOS (Apple Silicon). Linux and Windows users will need to adapt certain steps, particularly around &lt;code&gt;afplay&lt;/code&gt;, &lt;code&gt;brew&lt;/code&gt;, iTerm2, and system font installation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Claude Code supports a &lt;code&gt;statusLine&lt;/code&gt; configuration that pipes a live JSON object to a bash script on every update. Most developers ignore this. I spent time building it out properly and it's now the most-glanced piece of my development environment.&lt;/p&gt;

&lt;p&gt;Here's what my statusline shows in a real session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Sonnet 4.6 [Pro] | ⎇ feature/docling-eval | in:42k out:8k | ctx 61% | $0.0284 | +142/-38 | 5h 31% ⏱ 3h12m | 7d 18% ⏱ 4d6h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each segment is deliberate. Let me walk through them.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Each Segment Shows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model name&lt;/strong&gt; — &lt;code&gt;Claude Sonnet 4.6 [Pro]&lt;/code&gt;. Useful when switching between Sonnet and Opus mid-project. You always know what you're paying for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git branch&lt;/strong&gt; — &lt;code&gt;⎇ feature/docling-eval&lt;/code&gt;. The script uses &lt;code&gt;workspace.current_dir&lt;/code&gt; from the JSON payload for accuracy in worktree setups, not the shell's current directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token usage&lt;/strong&gt; — &lt;code&gt;in:42k out:8k&lt;/code&gt;. Input and output tokens in compact &lt;code&gt;k&lt;/code&gt; format. Abbreviated above 1000, raw below — so early in a session you see &lt;code&gt;in:340 out:89&lt;/code&gt; and it flips to &lt;code&gt;in:1k&lt;/code&gt; naturally as it grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context %&lt;/strong&gt; — &lt;code&gt;ctx 61%&lt;/code&gt; with color thresholds tuned for Pro plan. Green below 50%, yellow at 50%, orange at 60%, red at 75%. These are tighter than defaults because on Pro every token in a compacted context gets re-billed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt; — &lt;code&gt;$0.0284&lt;/code&gt; to 4 decimal places. Three decimal places rounds sub-cent sessions in a way that loses signal. At 4dp you can see the actual cost of a session clearly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lines changed&lt;/strong&gt; — &lt;code&gt;+142/-38&lt;/code&gt;. Only appears when there are actual file edits. Stays clean during pure Q&amp;amp;A work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5-hour rate limit&lt;/strong&gt; — &lt;code&gt;5h 31% ⏱ 3h12m&lt;/code&gt;. Usage percentage and countdown to reset. On Pro this is what tells you whether to push through a task or wrap up cleanly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7-day rate limit&lt;/strong&gt; — &lt;code&gt;7d 18% ⏱ 4d6h&lt;/code&gt;. The weekly ceiling is the one that bites during multi-day project sprints. Knowing you're at 18% on Wednesday is actionable in a way that daily usage alone isn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compaction warning&lt;/strong&gt; — at 75% context the display shows a blinking &lt;code&gt;⚠ COMPACT&lt;/code&gt;. This fires earlier than the default because on Pro, hitting auto-compaction mid-task reruns your entire context through the API.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Implementation
&lt;/h2&gt;

&lt;p&gt;The script is pure bash with &lt;code&gt;jq&lt;/code&gt; as the only dependency. &lt;code&gt;jq&lt;/code&gt; is a command-line JSON parser — install it with &lt;code&gt;brew install jq&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Wire it up in &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statusLine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/.claude/statusline.sh"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script reads from stdin (&lt;code&gt;input=$(cat)&lt;/code&gt;), extracts fields with &lt;code&gt;jq&lt;/code&gt;, applies color logic with ANSI escape codes, and outputs a single line. The JSON payload contains everything — model info, context window state, cost, rate limits, and workspace path.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing Without a Live Session
&lt;/h2&gt;

&lt;p&gt;You don't need to start a Claude Code session to test the script. Pipe mock JSON directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"model":{"display_name":"Claude Sonnet 4.6"},"workspace":{"current_dir":"/your/project"},"context_window":{"total_input_tokens":12000,"total_output_tokens":3000,"used_percentage":45},"cost":{"total_cost_usd":0.0084,"total_lines_added":42,"total_lines_removed":7},"rate_limits":{"five_hour":{"used_percentage":38,"resets_at":'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;7200&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'},"seven_day":{"used_percentage":22,"resets_at":'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;345600&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'}}}'&lt;/span&gt; | ~/.claude/statusline.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reset timestamps are computed from &lt;code&gt;now + seconds&lt;/code&gt; so the countdown shows real numbers.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Tradeoff Worth Knowing
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;used_percentage&lt;/code&gt; field is calculated from input tokens only — it does not include output tokens. So the context % reflects input-side pressure, which is the more meaningful signal for context window exhaustion, but it may differ slightly from what &lt;code&gt;/context&lt;/code&gt; reports. The script displays raw input and output token counts separately precisely for this reason.&lt;/p&gt;




&lt;p&gt;The full script is at &lt;a href="https://github.com/ai-with-avinash/claude-code-best-setup" rel="noopener noreferrer"&gt;https://github.com/ai-with-avinash/claude-code-best-setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;← &lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8"&gt;Back to Part 1&lt;/a&gt; | &lt;a href="https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38"&gt;Continue to Part 3 → Sound Notification Hooks&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>claudecode</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Building a Complete Developer Terminal Setup for Claude Code — Part 1: The Problem</title>
      <dc:creator>Avinash Seethalam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 10:12:40 +0000</pubDate>
      <link>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8</link>
      <guid>https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-1-the-problem-5eb8</guid>
      <description>&lt;p&gt;&lt;em&gt;By Avinash, GenAI Practice Lead&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Note: This setup is macOS-specific.&lt;/strong&gt; All tools, commands, and configurations in this series are tested on macOS (Apple Silicon). Linux and Windows users will need to adapt certain steps, particularly around &lt;code&gt;afplay&lt;/code&gt;, &lt;code&gt;brew&lt;/code&gt;, iTerm2, and system font installation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I lead a GenAI practice and manage a broad portfolio of active AI projects. A significant part of my day is spent inside Claude Code — building model evaluation frameworks, debugging pipelines, writing architecture documents, and reviewing code with my team. Claude Code is genuinely powerful, but after weeks of daily use I kept running into the same friction points.&lt;/p&gt;

&lt;p&gt;Sessions started completely blind every time. No memory of what we built yesterday, no context on decisions made last week. I'd spend the first 10 minutes of every session re-establishing context that Claude had already processed the day before.&lt;/p&gt;

&lt;p&gt;There was no visibility into token usage or cost while working. I'd hit a rate limit mid-task with no warning, losing momentum at the worst possible moment. On a Pro plan where every token has a cost, flying blind is expensive.&lt;/p&gt;

&lt;p&gt;Claude finishing a task while I was context-switched elsewhere meant I'd come back 5 minutes later to find it waiting. No notification, no signal — just a blinking cursor.&lt;/p&gt;

&lt;p&gt;And the terminal itself was a plain, low-information environment. No git context, no Python version, no time — just a prompt.&lt;/p&gt;

&lt;p&gt;These aren't complaints about Claude Code. They're gaps in the surrounding environment that any developer can close with the right setup. So I spent a day closing them.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Over a focused session I assembled a complete terminal environment optimised specifically for Claude Code development on macOS. Here's the full stack:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code layer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom bash statusline showing model, git branch, token usage, cost, context %, and rate limit countdowns&lt;/li&gt;
&lt;li&gt;Sound notification hooks using macOS &lt;code&gt;afplay&lt;/code&gt; for task completion, permission requests, and idle state&lt;/li&gt;
&lt;li&gt;9 curated plugins covering code review, persistent memory, Python type checking, and workflow automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Terminal layer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iTerm2 with tokyo-night color theme and JetBrains Mono Nerd Font&lt;/li&gt;
&lt;li&gt;tmux with a 3-pane layout and session persistence across restarts&lt;/li&gt;
&lt;li&gt;Starship prompt with tokyo-night preset showing git status and Python version&lt;/li&gt;
&lt;li&gt;fzf for fuzzy command history search&lt;/li&gt;
&lt;li&gt;zsh-autosuggestions and zsh-syntax-highlighting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is committed to a dotfiles repo at &lt;a href="https://github.com/ai-with-avinash/claude-code-best-setup" rel="noopener noreferrer"&gt;https://github.com/ai-with-avinash/claude-code-best-setup&lt;/a&gt; with a fresh machine checklist so the entire setup can be reproduced on a new Mac in under an hour.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Series
&lt;/h2&gt;

&lt;p&gt;This is Part 1 of 6. Each subsequent article covers one layer of the setup in detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj"&gt;Part 2&lt;/a&gt;&lt;/strong&gt; — Custom Statusline: real-time token, cost, and rate limit visibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dev.to/avinash431/-building-a-complete-developer-terminal-setup-for-claude-code-part-3-sound-notification-hooks-4i38"&gt;Part 3&lt;/a&gt;&lt;/strong&gt; — Sound Notification Hooks: knowing when Claude is done without watching the screen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-4-plugin-stack-1044"&gt;Part 4&lt;/a&gt;&lt;/strong&gt; — Plugin Stack: 9 plugins that earn their place and what I removed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-5-terminal-environment-184h"&gt;Part 5&lt;/a&gt;&lt;/strong&gt; — Terminal Environment: iTerm2, tmux, starship, fzf, and zsh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-6-dotfiles-and-wrap-up-54c0"&gt;Part 6&lt;/a&gt;&lt;/strong&gt; — Dotfiles Repo: packaging everything for reproducibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each part is self-contained — you can read them in any order depending on what's most relevant to your setup. But if you're starting fresh, the sequence matters and Part 2 is where I'd begin.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://dev.to/avinash431/building-a-complete-developer-terminal-setup-for-claude-code-part-2-custom-statusline-4lmj"&gt;Continue to Part 2 → Custom Statusline&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claude</category>
      <category>claudecode</category>
    </item>
  </channel>
</rss>
