Modern dotfiles installer with animated progress display.
Clone and run the dotfiles installer from https://github.com/jiunbae/settings
Quick install: curl -LsSf https://settings.jiun.dev | bash -s -- --all
Core only: curl -LsSf https://settings.jiun.dev | bash -s -- --core
Pick & choose: curl -LsSf https://settings.jiun.dev | bash -s -- zsh nvim tmux tools
Post-install: exec zsh
╔══════════════════════════════════════════════════════════════╗
║ Settings Installer ║
╠══════════════════════════════════════════════════════════════╣
║ [████████████████████████████████████████░░░░░░░░░░] 80% ║
║ [6/8] Rust toolchain ║
╚══════════════════════════════════════════════════════════════╝
✓ Installing Rust via rustup
✓ Installing cargo-binstall
⠋ Installing eza...
# everything
curl -LsSf https://settings.jiun.dev | bash -s -- --all
# pick components
curl -LsSf https://settings.jiun.dev | bash -s -- zsh nvim tmux
# choose from a menu
curl -LsSf https://settings.jiun.dev | bash -s -- --interactiveOr clone it first:
git clone https://github.com/jiunbae/settings.git && cd settings
./install.sh --all| Preset | Installs |
|---|---|
--all |
everything |
--core |
base, zsh, nvim, tmux, tools |
--basic |
base, zsh, nvim, tmux |
| (no args) | interactive selector |
| Area | Components |
|---|---|
| Shell | zsh + zinit + Powerlevel10k, with autosuggestions and fast-syntax-highlighting · PowerShell 7 + starship + PSFzf on Windows |
| Editor | NeoVim + LazyVim, with the tree-sitter CLI for parsers |
| Multiplexer | tmux + TPM · zellij · rmux on Windows |
| CLI tools | eza ls · fd find · ripgrep grep · fzf |
| CLI extras | delta git diff · dust du · procs ps · bottom htop |
| Toolchains | Rust + cargo-binstall · uv · fnm |
| AI agents | Claude Code · Codex · cship statusline — see agent-state.md |
| History | hishtory — context, search, cross-device sync |
| macOS | Hammerspoon — window, screen and keyboard automation |
Components install independently and are safe to re-run; --dry-run previews any
combination of them without changing anything.
| Platform | Package manager | Architecture | Installer |
|---|---|---|---|
| Ubuntu/Debian | apt | x86_64, arm64 | install.sh |
| macOS | Homebrew | Intel, Apple Silicon | install.sh |
| WSL | apt | x86_64 | install.sh |
| Windows | winget | x86_64 | manual — windows.md |
Note
install.sh does not run on Windows: lib/platform.sh detect_platform exits on
anything that is not Linux or Darwin. Windows configs live in configs/ and are
placed by hand, following the same pattern as configs/windows-terminal/.
Usage: install.sh [OPTIONS] [COMPONENTS...]
Options:
-i, --interactive Interactive component selector (default when no args)
-a, --all Install all components
--core Install core dev environment (base, zsh, nvim, tmux, tools)
-b, --basic Install basic dev environment (base, zsh, nvim, tmux)
-f, --force Force reinstall (overwrite existing)
-c, --copy Copy config files instead of symlink
-l, --link Create symlinks for config files (default)
-v, --verbose Enable verbose output
-n, --dry-run Show what would be done without making changes
--no-sudo Skip commands that require sudo privileges
-h, --help Show this help message
--version Show version
Components:
base Basic packages (curl, wget, git, build-essential)
zsh Zsh + zinit + Powerlevel10k
nvim NeoVim + LazyVim
tmux tmux + TPM (terminal multiplexer)
zellij zellij (modern terminal multiplexer)
rust Rust toolchain + cargo-binstall
uv uv (fast Python package manager)
tools CLI tools (eza, fd, ripgrep, fzf)
tools-extra Extra CLI tools (delta, dust, procs, bottom)
ssh SSH config (copy only, not symlinked)
hishtory hishtory (better shell history with self-hosted sync)
hammerspoon Hammerspoon (macOS-only: window manager + keybindings)
ghostty Ghostty terminal config (macOS-only: Option-as-Alt so TUI Alt bindings work)
codex Codex CLI/App config, hooks, and notify chain
claude Claude Code settings, hooks, skill index, memory, MCP servers
cship cship + Starship (fast Claude Code statusline, replaces ccstatusline)
scripts Personal CLI scripts linked into ~/.local/bin
./install.sh --dry-run --all # preview, change nothing
./install.sh -v zsh # one component, verbose
./install.sh --force zsh # reinstall over an existing setup
cat ~/.install.log # what actually happenedexec zsh # or: source ~/.zshrc
eza --version && rg --version # sanity checkThe aliases come from configs/.zshrc: ls/ll/la/lt → eza, find → fd,
grep → rg, du → dust, ps → procs, top/htop → btm, vim/vi → nvim, and
zs/za/zl for zellij sessions. The PowerShell profile mirrors these, except that
the ones shadowing an existing command stay interactive-only — see
windows.md.
settings/
├── install.sh # Main installer
├── bootstrap.sh # One-line installer (also published to gh-pages)
├── lib/ # Shared: cli, core, platform
├── modules/ # One file per component
├── configs/ # The dotfiles themselves
│ ├── .zshrc .p10k.zsh .tmux.conf .rmux.conf
│ ├── nvim/ zellij/ powershell/ windows-terminal/
│ └── claude/ codex/ cship/ hishtory/
├── bin/ # Personal CLI scripts, linked onto PATH
│ └── windows/ # Windows-only; install.sh never sees this dir
├── scripts/ # Build and maintenance helpers
├── docs/ # The guides linked below
├── .gitea/workflows/ # Releases run on the self-hosted Gitea runner
└── worker/ # Cloudflare Worker — written, never deployed
| components.md | hishtory sync, Hammerspoon permissions, the managed Codex config |
| windows.md | rmux, PowerShell, NeoVim, Windows Terminal, Nextcloud upload |
| powershell.md | How the PowerShell profile went from 1354ms to 394ms |
| agent-state.md | Restoring Claude Code / Codex state on a new machine |
| tmux-to-zellij.md | Migration notes |
settings.jiun.dev is GitHub Pages from the gh-pages branch, not the Worker in
worker/ — that was written but never deployed. gh-pages carries its own copy of
bootstrap.sh, duplicated as index.html so the pathless one-liner works, and nothing
syncs it automatically.
Important
After changing bootstrap.sh, run scripts/sync-gh-pages.sh --push. The copy once
went stale for five months — long enough that the published installer was missing the
guard that refuses to git reset --hard over uncommitted local changes.
MIT