Krish

Search portfolio

Search pages, projects, blog posts, experience, and links.

Back to Blog
MDX

My Terminal Setup for Work and Productivity

ghostty
zsh
terminal
dotfiles
starship
fastfetch
pokeget

I run Ghostty as the terminal and Zsh as the shell. Copy the config files below, paste, reload — plus a random Pokémon on every new tab.

References: Ghostty docs · Zinit · Starship · FZF · zoxide · fastfetch · pokeget · Tokyo Night

Why this setup

Most terminal stacks bury you in nested config or lock you into cloud tooling. I wanted the opposite: open files I can read, edit, and move across machines.

  • Ghostty — plain key = value config, fast rendering, live reload. Tokyo Night palette + light glass blur keeps long sessions easy on the eyes.
  • Zsh + Zinit — syntax highlighting, autosuggestions, fzf-tab, and history search without the weight of a full Oh My Zsh install.
  • Starship — one prompt config that works everywhere.
  • FZF + zoxide — fuzzy find and smart cd so navigation stays in the keyboard flow.
  • Two files~/.config/ghostty/config for how the terminal looks, ~/.zshrc for how the shell behaves. That split makes the setup portable and easy to share.
  • pokeget + fastfetch — a random Pokémon sprite on every new shell, piped into fastfetch as the logo beside your system info.

If you live in the terminal for dev, GPU jobs, or remote SSH work, this combo stays out of your way while still feeling polished.

Step 1 — Install your tools

Install Ghostty, Zsh, and the shell tools used in the config below: Starship, FZF, zoxide, eza, fd, fastfetch, and pokeget. Zinit plugins install automatically on first shell open.

Run this to install everything in one go — toggle macOS or Linux at the top:

brew install zsh starship fzf zoxide eza fd fastfetch && \
brew install --cask ghostty && \
cargo install pokeget

Step 2 — Create the config paths

Run this in your terminal:

mkdir -p ~/.config/ghostty ~/.config/fastfetch
touch ~/.zshrc

Step 3 — Paste your Ghostty config

Expand the file, copy the full block, and paste it into ~/.config/ghostty/config.

Validate with ghostty +validate-config (docs).

Step 4 — Paste your Zsh config

Expand the file, copy the full block, and paste it into ~/.zshrc. Put machine-specific overrides in ~/.zshrc.local so the main file stays portable.

Step 5 — Pokémon startup with fastfetch

Every time you open a new terminal, a random Pokémon sprite shows up next to your system info. pokeget renders the sprite, fastfetch prints the stats — the sprite is piped in as the logo.

Random Pokémon sprite next to fastfetch system info
Random Pokémon sprite next to fastfetch system info

How it loads: the last block in ~/.zshrc runs only in interactive shells ([[ -t 1 ]]), pipes pokeget random --hide-name into fastfetch, and passes - as the logo source (stdin). See the fastfetch logo docs.

Paste the fastfetch config below into ~/.config/fastfetch/config-compact.jsonc:

The startup command is already at the bottom of the ~/.zshrc block in Step 4:

pokeget random --hide-name | fastfetch -c $HOME/.config/fastfetch/config-compact.jsonc --logo-type file-raw --logo-height 10 --logo-width 5 --logo-padding-left 3 --logo -
  • pokeget random --hide-name — picks a random Pokémon and skips the name label above the sprite
  • --logo-type file-raw — tells fastfetch the logo is raw terminal image data from stdin
  • --logo -- is fastfetch's alias for stdin (docs)

Open a new terminal tab to see it. Want a specific Pokémon? Swap random for a name, e.g. pokeget pikachu --hide-name.

Step 6 — Reload

Run this to apply the shell config:

source ~/.zshrc

Ghostty reloads most settings when you save the config file. Open a new tab if something does not apply.

Conclusion

That is the full stack — Ghostty for the look, Zsh for the behavior, fastfetch and pokeget for the small details that make a new tab worth opening.

Once it is running, the friction mostly disappears. The theme holds up through long sessions, autosuggestions and fzf-tab cut seconds off routine commands, and the random Pokémon sprite is a nice touch without getting in the way. You could strip this down to Ghostty + Zsh and still be productive — but this is the environment I actually want when I am debugging, SSH-ing into a GPU box, or jumping between projects.

I treat both config files as living documents. Font too small, blur too heavy, a plugin slowing startup — change one line, reload, move on. The terminal should bend to how you work, not the other way around.

If you are trying this yourself, start with the Ghostty colors and the Zsh plugins. Get those right first, then layer in fastfetch and pokeget when you want personality. Keep machine-specific tweaks in ~/.zshrc.local so the main files stay clean and easy to share.

This is what I run every day — not perfect, but dialed in enough that opening a terminal never feels like a chore. Two files, paste, tweak until it fits you.

Hope you like my setup. See you soon!

My Terminal Setup for Work and Productivity - Krish Bakshi