A terminal setup for Ubuntu inspired by Omaterm and Omarchy.
One command, three delivery channels — apt for the OS layer, mise for the version-pinned toolbelt, and a little glue (Tailscale, SSH key, Oh My Zsh, TPM, gum) for what package managers won't do. Unpacked, it looks like this:
┌──────────────────────────────────────────────────────────────┐
│ TERMINAL zsh + oh-my-zsh · starship · tmux · fzf │
│ TERMINAL zoxide · atuin · sesh │
│ FILES eza · bat · fd · ripgrep · yazi │
│ SYSTEM btop · duf · glow · tlrc · jq · yq · xh │
│ GIT lazygit · gh · hunk · worktrunk │
│ DOCKER docker · compose · lazydocker │
│ AGENTS opencode · claude-code │
│ EDITOR neovim · lazyvim │
│ RUNTIMES node (lts) · python · go · rust │
└──────────────────────────────────────────────────────────────┘
Everything in the box is declared in ~/.config/mise/config.toml and kept current with a single mise upgrade; the apt layer runs on unattended-upgrades so security patches land by themselves. Worth knowing before you click around: hunk stages line-level git changes, worktrunk spins up git worktrees for parallel agents, sesh is the tmux session picker behind prefix + T, and duf/btop/tlrc/glow are the pretty versions of df, top, man, and markdown-cat.
curl -fsSL https://raw.githubusercontent.com/mrpbennett/sdots/main/install.sh | bash
Log out and back in after installation before using Docker without sudo.
All symlinks are managed with --no-folding so stow creates real directories and only symlinks individual files. This prevents conflicts when multiple tools share a parent like ~/.config/.
| Command |
Purpose |
stow --no-folding --restow --dir "$DOTFILES_DIR" --target "$HOME" . |
Relink everything (safe to re-run after adding/removing files) |
stow --no-folding --simulate --dir "$DOTFILES_DIR" --target "$HOME" . |
Dry run — preview what would change without touching the filesystem |
stow --delete --dir "$DOTFILES_DIR" --target "$HOME" . |
Remove all managed symlinks (leaves real files untouched) |
$DOTFILES_DIR is wherever you cloned the repo — typically ~/.local/share/sdots.
All custom keybindings — prefix is Ctrl+Space or Ctrl+s
| Key |
Action |
prefix + q |
Reload config |
prefix + ? |
Show all keybindings (popup) |
| Key |
Action |
prefix + | |
Split right |
prefix + - |
Split down |
prefix + h |
Split right (vim-style) |
prefix + v |
Split down (vim-style) |
prefix + x |
Kill pane |
prefix + f |
Floating shell popup (80×60%) |
Alt + Enter |
Split right (no prefix) |
Alt + Shift + Enter |
Split down (no prefix) |
Alt + Escape |
Kill pane (no prefix) |
| Key |
Action |
prefix + h/j/k/l |
Navigate panes (vim-style) |
Ctrl + Alt + ←/→/↑/↓ |
Navigate panes (arrows) |
Ctrl + Alt + h/j/k/l |
Navigate panes (vim, no prefix) |
| Key |
Action |
prefix + H/J/K/L |
Resize pane 5 cells |
Ctrl + Alt + Shift + ←/→/↑/↓ |
Resize pane 5 cells (no prefix) |
| Key |
Action |
prefix + c |
New window |
prefix + r |
Rename window |
prefix + k |
Kill window |
| Key |
Action |
Alt + 1–9 |
Switch to window (no prefix) |
Alt + ← |
Previous window (no prefix) |
Alt + → |
Next window (no prefix) |
Alt + Shift + ← |
Move window left (no prefix) |
Alt + Shift + → |
Move window right (no prefix) |
| Key |
Action |
prefix + C |
New session |
prefix + R |
Rename session |
prefix + K |
Kill session |
prefix + P |
Previous session |
prefix + N |
Next session |
prefix + T |
Sesh session picker (fzf popup) |
| Key |
Action |
prefix + [ |
Enter copy mode |
v |
Begin selection |
y |
Copy selection and exit |