My personal dotfiles. The whole thing leans on three ideas: keep it minimal, keep it consistent, and make every tool look like it belongs to the same family. What's here:
- Brew dependencies (apps, fonts, LSPs) in
Brewfile - Apps and tools config in
dotfiles/.config/ - Claude Code setup,
settings.jsonand statusline, indotfiles/.claude/(global rules sync via Kasetto, see below) - Git, SSH, GPG in
.gitconfig,.ssh/,.gnupg/
- Minimalism, consistency, simplicity
- One unified look via pivoshenko.theme. Right now I'm running Popil (warm ash, muted terracotta). Morok (pitch black, cool accents) and Vatra (Carpathian hearth, gruvbox-warm) are vendored alongside it
- JetBrains Mono, everywhere
To switch flavors: just set-flavor <morok|popil|vatra>, then just dotfiles.
Everything is managed with dotdrop and driven through just.
- Fork and clone this repository
- Install everything:
just installThat runs brew bundle, deploys both dotdrop profiles, bootstraps Fisher and the fish plugins, builds the bat theme cache, links the vault, and reinstalls the herdr hook and plugins. Need only one part? Every step is its own recipe - run just on its own to see them.
Three files stay untracked and have to be created by hand on a new machine:
~/.gitconfig.local- your[user]block..gitconfigsetsuseConfigOnly = true, so git refuses to commit until this exists. Commits are GPG-signed, so it also needssigningkey = <your key id>~/.config/fish/local.fish- anything shell-related that is specific to this machine~/.config/fish/.secrets.fish- tokens and keys
Note
A few things still want a manual step, because the app owns its own settings store rather than reading a file: Telegram and Discord (theme installs through the app's UI), Obsidian (theme picked in appearance settings), and Stylus and Rectangle (import the exported JSON). The relevant sections below spell out what to do.
Ghostty is a fast, GPU-accelerated, native macOS terminal from Mitchell Hashimoto. It's the first terminal in years that feels designed rather than accreted. No perceptible latency, and a config format that reads cleanly. Config: dotfiles/.config/ghostty.
Fish comes with the good stuff already on: autosuggestions, syntax highlighting, and scripting that doesn't drag along bash's compatibility baggage. I run it with a handful of plugins through Fisher. Config: dotfiles/.config/fish.
Prompt is Starship: one binary, one TOML file, works in every shell, and fast enough that I stop noticing it. Config: dotfiles/.config/starship.toml.
The tools I reach for every day, all configured under .config/:
- Bat -
catwith syntax highlighting and git gutters. Hard to go back once you've used it - Bottom -
htoprethought: keyboard-driven, themable, readable on a wide monitor - Delta - makes
git diffpleasant to read instead of a squinting exercise - Eza - a modern
lswith icons, git status, and a tree mode that handles big repositories fine - Fastfetch - fast, configurable, JSONC-driven system fetch
- Fd -
findwith sane defaults and far less typing - Fzf - fuzzy-finds everything and plugs into everything. If I could keep one CLI tool, this is it
- Ripgrep - very fast grep that respects
.gitignoreout of the box - K9s - a Kubernetes UI that keeps me out of
kubectl get pods | grep - LazyGit - staging, rebases, and cherry-picks at TUI speed. It replaced every GUI git client I used to run
- LazyDocker - the same idea as LazyGit, pointed at containers and compose stacks
- Zoxide - a smarter
cdthat learns the directories you actually use. Typez fooand you're there
The full list of installed CLI tools is in the Brewfile.
Helix is my primary CLI editor, and I keep moving more day-to-day work into it. Its selection-first modal model (selection then action, Γ la Kakoune) clicked for me in a way Vim's verb-object grammar never quite did. Multiple cursors and tree-sitter selections feel native rather than bolted on, and LSP works without a plugin scavenger hunt. Config: dotfiles/.config/helix.
Zed is my daily editor. It's Rust-native, GPU-accelerated, and collaborative, and it ships Vim, Helix, and Whichkey modes in the box instead of leaving them to third-party plugins. Config: dotfiles/.config/zed/settings.json.
Claude Code is my coding assistant. Config (settings.json plus a custom statusline): dotfiles/.claude.
Skills, MCPs, and instructions (the global CLAUDE.md / AGENTS.md rules) are distributed across hosts with Kasetto. The Kasetto config lives in pivoshenko/pivoshenko.ai, with personal and external sources both included.
The global rules used to be a single CLAUDE.md in this repository. They now live as individual instruction files in pivoshenko.ai/instructions, with a structure loosely inspired by Andrej Karpathy's CLAUDE.md.
Herdr is the daemon my agents run on. It keeps real terminal sessions open in the background, so a long task survives the lid closing or the network dropping and is still there when I come back. It drives several agents across workspaces at once and shows at a glance which ones are working, blocked, or idle.
Config: dotfiles/.config/herdr/config.toml. Only the config file is managed, since the rest of ~/.config/herdr holds sockets, logs, and session state.
I drive as much as I can from the keyboard, with Vi/Kakoune motions. Where macOS or the window manager won't cooperate, Karabiner covers the gap. It's built around home row mods, following this guide.
Config: dotfiles/.config/karabiner/karabiner.json.
Rectangle gives me i3-style tiling on macOS. I tried yabai and Aerospace first; Rectangle won on the boring but decisive point of surviving every macOS update without any SIP gymnastics. Config: dotfiles/.config/rectangle/config.json. Rectangle keeps its live settings in its own preferences plist, so this file is an export - import it from Preferences -> ... -> Import, the same way the Stylus and Telegram themes go in.
Zen is a Firefox fork that ships the browser experience I'd been hand-rolling with userChrome hacks for years: keyboard-driven, vertical tabs, minimal chrome. Extensions:
- Custom New Tab - sends new tabs to my own startpage instead of Mozilla's default
- DuckDuckGo - my default search
- MetaMask - Ethereum/EVM wallet, the one every dapp assumes you already have
- NordPass - password manager I've stuck with for years; the autofill stays out of the way
- NordVPN - same family, same story
- Obsidian Web Clipper - clips articles straight into the vault as clean Markdown, no copy-paste dance
- Phantom - Solana-first multichain wallet; cleaner UX than MetaMask when I'm off EVM
- Privacy Badger - EFF's heuristic tracker blocker, which pairs well with uBlock without stepping on it
- RaindropIo - bookmarks with tags, collections, and a UI I don't mind opening
- Stylus - userstyles, minus the abandonware history of Stylish
- uBlock - the ad blocker. Thank you, Raymond Hill
- Vimium - keyboard navigation on every page; once
ffollows a link for you, the mouse feels slow
userChrome.css / userContent.css live in dotfiles/.config/zen and deploy into the active profile's chrome/ subfolder.
Per-site styling is handled by Stylus. The userstyles export to dotfiles/.config/stylus and get imported through the extension's preferences.
I keep my notes in Obsidian: local-first, plain Markdown on disk, no lock-in, and a plugin ecosystem that covers what I'd otherwise reach for Notion for. The vault syncs over iCloud. Vendored themes and snippets in dotfiles/.config/obsidian deploy via the me profile into <vault>/.obsidian/{themes,snippets}/; the vault path is machine-specific and set in dotdrop.config.yaml. The active theme is chosen inside Obsidian's appearance settings.
Plugins:
- Obsidian Admonition - styled callout blocks (notes, warnings, tips) that still save as plain Markdown
- Obsidian Images in-editor - inline image previews in source mode, so I stop flipping to preview
- Obsidian Tag Wrangler - rename and merge tags without a grep-and-replace across the vault
- Obsidian Outliner - bullet handling that behaves like Workflowy or Roam
- Obsidian Style Settings - surfaces theme variables in the UI so I'm not editing CSS to change an accent
Spotify is customized through Spicetify. Themes live in dotfiles/.config/spicetify/Themes; activate a flavor with just spicetify <morok|popil|vatra>.
Telegram with my Popil theme, installed from t.me/addtheme/pivoshenko_theme_popil.
The official Discord client is missing too much for me, so I run Vesktop instead. Install the Popil theme through Themes -> Online Themes:
@dark https://raw.githubusercontent.com/pivoshenko/pivoshenko.theme/refs/heads/main/dist/discord/popil.theme.css- f.lux - warms the display after sunset; I notice right away on a machine that doesn't have it
- NordPass / NordVPN - a password manager and a VPN I've run for years without having to think about either. That's the whole point
- DBeaver - one client for every database I touch. The Eclipse bones are ugly, but it handles Postgres, MySQL, SQLite, and Mongo without me hunting down a vendor GUI for each
- Redis Insight - the one exception to DBeaver: Redis's own GUI reads streams, keyspaces, and memory in a way a generic SQL client never quite matches
- Tailscale - WireGuard with the setup pain removed. My NAS, work boxes, and phone all sit on one flat network, and I haven't touched VPN config in years
- Maccy - clipboard-history manager: lightweight, keyboard-driven, and out of the way until I hit the hotkey
- Logi Options+ - per-app buttons and gestures for the Logitech mouse, which is what finally makes the extra thumb buttons worth having
- Docker Desktop - the container runtime everything else assumes; LazyDocker just drives what it provides