Skip to content

The shell (hearth)

hearth is the cozy terminal room. It sets up the whole command-line experience — the terminal emulator, the multiplexer, the shell, the prompt, the file manager, the editor, and a toolbelt of modern CLI replacements — every one of them painted in nebelung colours.

LayerToolNotes
TerminalGhosttyfont size 19, title bar hidden, auto-attaches to zellij
Multiplexerzellijcustom tab bar + status bar, grid/spiral/columns layouts
Shellzshframework-free, fzf-tab, sensible history, declarative Git aliases
Promptstarshipnebelung-tinted
File manageryazimarkdown & code previews, image previews via chafa
Editorhelixthe default $EDITOR, nebelung theme
Jumperzoxidefrecency cd, cdi for an fzf picker

Plus a themed toolbelt: bat (aliased over cat), lsd (over ls), lazygit (lg), claude (c), delta for git diffs, fzf, fd, jq, gh, glow, fastfetch, and nix-index + comma so you can run any nixpkgs command on demand.

Hearth uses plain zsh—no shell framework—and supplies a finite set of Git shortcuts directly. The names follow the broadly used Oh My Zsh-style vocabulary where conventions agree, while deliberately avoiding ambiguous shortcuts such as gl, gr, and gs, whose meanings differ between popular alias sets.

AreaAliases
Addga, gaa, gapa
Branch / checkout / clonegb, gba, gbd, gbD, gbm, gco, gcb, gcl, gsw, gswc
Commit / cherry-pickgc, gca, gcam, gcmsg, gcn, gcp, gcpa, gcpc
Diff / loggd, gds, gdw, glo, glog, gloga
Fetch / mergegf, gfa, gfo, gm, gma, gmc, gmff
Pull / pushgpl, gpr, gp, gpf, gpsup
Rebase / repositorygrb, grba, grbc, grbi, grbs, grt, grv
Status / stashgst, gss, gsb, gsta, gstl, gstp, gsts
Tag / worktreegt, gwt, gwta, gwtl, gwtr

g itself is git. Add, replace, or remove shortcuts per host with nebelhaus.git.shellAliases:

nebelhaus.git.shellAliases = {
gst = "git status --short --branch"; # replace
gsync = "git pull --rebase --autostash"; # add
gco = null; # remove
};

Launching Ghostty drops you straight into a persistent zellij session called main. New panes and tabs inherit your working directory. A few conveniences:

  • Ghostty’s ⌘T, ⌘P, ⌘Y, ⌘C and friends are unbound on purpose — zellij owns those, so the same keys work whether or not you’re multiplexed.
  • Ctrl-Tab / Ctrl-Shift-Tab walk your tabs in most-recently-used order, browser-style — one tap bounces between your two hottest tabs; keep tapping to go further back. (Ghostty forwards the kitty-protocol encoding so zellij sees them.)
KeysAction
Super PNew pane, inheriting cwd — but a shell born inside a claude --worktree checkout hops to the repo’s main checkout
Super ⇧PNew pane, stay here — inherits cwd with no hop, so you get a shell right inside the worktree
Super TNew tab at $HOME — born named ~ (fresh tabs are never Tab #N)
Super ⇧TNew tab at the focused pane’s directory — with the same worktree hop as Super P
Super FFullscreen the focused pane — zoom it to fill the tab, tap again to drop back into the tiled layout
Super RReload the terminal stack — gracefully quit/reopen Ghostty, then start a fresh zellij server with the same tabs, panes and working directories; live Claude Code panes resume their exact conversations
Super Yyazi peek — a floating browser with live previews; Enter on a directory opens a new tab there
Super ⇧Yyazi jump — browse, then drop a shell in the landing directory
Ctrl Tab / Ctrl ⇧TabTab history back / forward (most-recently-used)
Alt < / Alt >Cycle swap layouts (grid → spiral → columns)

The reload is also available as zreload from a shell. It prepares the recovery layout inside zellij, then hands the quit/delete/reopen sequence to a launchd agent outside the terminal, so killing the old server cannot strand its own script. This is a real Ghostty quit and relaunch, not reload_config: that action only reparses Ghostty settings and would leave the old launcher process alive. Each zellij server generation keeps an explicit pane-to-Claude-session manifest, so a foreground tool such as sourcekit-lsp cannot be mistaken for the pane that launched it. If any active command pane cannot be proven resumable, reload stops before quitting Ghostty or deleting the session.

zellij ships three swap layouts, cycled with Alt < / Alt >:

  • Grid (default) — the most balanced square arrangement, every pane equal area.
  • Spiral — balanced 50/50 nesting, largest pane top-left.
  • Columns — equal full-height columns side by side.

yazi is set up for fast previewing: markdown renders through glow, code through bat (syntax-highlighted), and images through chafa near-fullscreen inside zellij. Press Y to copy a file’s contents (not just its path), and Esc to close a floating peek. In the Super Y peek overlay, Enter on a file pages it fullscreen while Enter on a directory opens a new zellij tab there (use l / to descend into a directory without leaving peek) — so peek doubles as the browse-and-pick “new tab” chooser.

helix is the default. nebelhaus.hearth.editor is the one editor the rice uses everywhere — it’s your $EDITOR / $VISUAL, and it’s what every “open in an editor” action launches (the “Nix Config” palette command, the bar’s nix-open item, and the file-association hijack below). Those open the target in a new zellij tab running it, so a terminal editor is the natural fit; a GUI editor’s CLI works too. Set it in your host file:

nebelhaus.hearth.editor = "nvim"; # any terminal editor
# a GUI editor's CLI works too, e.g. "code" or "code -w" to block

One related knob:

  • nebelhaus.hearth.hijackFileAssociations — off by default; when true, makes your editor the default opener for .json, .md, .ts, .nix, and similar via duti.
  • zoxidecd learns your habits; cdi opens an fuzzy picker of your frequent directories.
  • Git aliases — a compact, framework-independent set (g, gst, gco, gcb, gp, gpf, grbi, gwt, …) ships built in — no oh-my-zsh. Add, override, or remove one with nebelhaus.git.shellAliases.
  • Auto-renaming tabscd into a repo and the zellij tab renames itself after it; cd ~ renames it back to ~, the name every fresh tab is born with (no Tab #N anywhere).
  • Claude Code aware — new shells opened (Super P / Super ⇧T) inside a ~/.cache/claude-worktrees checkout hop to the parent repo automatically — and the Super ⇧T tab is named after the main repo, not the throwaway worktree. Want a shell inside the worktree instead? Super ⇧P is the no-hop escape hatch.

See Theming & accents for how every tool above gets its colours, and the options reference for every hearth knob.