A modular configuration bank for building reproducible development environments across Ubuntu Server, Windows, and optional Arch WSL.
This document describes the current setup scripts, package groups, dotfiles, and platform-specific behavior in this repository.
- Bootstrap Flow
- Shell
- CLI Tools
- Terminal And Editors
- File Manager
- Development Languages And Runtimes
- Shared Non-Windows Package Baseline
- Platform-Specific: Ubuntu Server
- Platform-Specific: Windows
- Platform-Specific: Arch WSL
- Dotfiles Summary
The root bootstrap scripts download the latest GitHub release when available, fall back to the main branch when needed, stage the repository under ~/.setup-config, back up any previous staged install, and hand off to the platform installer.
| Platform | Bootstrap | Installer |
|---|---|---|
| Ubuntu Server | bootstrap.sh |
ubuntu-server/install.sh |
| Windows | bootstrap.ps1 |
windows/install.ps1 |
bootstrap.sh supports ubuntu, linux, and server as Ubuntu Server aliases. Interactive mode can auto-detect apt-based Linux systems or prompt for Ubuntu Server.
The Linux bootstrap ensures curl and unzip exist before downloading the archive.
bootstrap.ps1 downloads and validates the ZIP archive, extracts with Expand-Archive or a .NET fallback, unblocks PowerShell files, and runs windows/install.ps1 from the staged repository.
The Unix-like shell is Zsh with Oh My Zsh.
| Component | Value |
|---|---|
| Shell | zsh |
| Framework | Oh My Zsh |
| Theme | blacknpink |
| Config location | ~/.zshrc |
| Custom files | ~/.oh-my-zsh/custom/ |
| Plugin | Source | Description |
|---|---|---|
git |
Built-in | Git aliases and completions |
vi-mode |
Built-in | Vi keybindings in shell |
zsh-autosuggestions |
zsh-users/zsh-autosuggestions |
Fish-like autosuggestions |
zsh-syntax-highlighting |
zsh-users/zsh-syntax-highlighting |
Syntax highlighting |
inaya |
Custom dotfile | Personal aliases, functions, and environment |
Location: dotfiles/zsh/.oh-my-zsh/custom/themes/blacknpink.zsh-theme
The theme is based on Oh My Zsh's bundled refined prompt and maps prompt colors to the shared Black & Pink palette.
Location: dotfiles/zsh/.oh-my-zsh/custom/plugins/inaya/inaya.plugin.zsh
Key environment defaults include XDG paths, nvim as editor, xterm-256color, UTF-8 locale, and vi-mode cursor support.
Key aliases and functions include nvim shortcuts, modern CLI replacements for ls, find, and grep, lg for Lazygit, ff for Fastfetch, y for Yazi directory handoff, pf for fuzzy file opening, mkd, reload-zsh, update, and cleanup.
Windows uses PowerShell Core with Oh My Posh.
| Component | Value |
|---|---|
| Shell | PowerShell Core (pwsh) |
| Prompt | Oh My Posh |
| Theme | black-pink.omp.json |
| Profile | windows/dotfiles/PowerShell/Microsoft.PowerShell_profile.ps1 |
| Modules | PSReadLine, Terminal-Icons |
PowerShell profile features include vi mode keybindings, history predictions, cursor shape changes for insert and normal modes, terminal icons, and Windows Terminal integration helpers.
| Tool | Purpose | Replaces |
|---|---|---|
eza |
Modern ls with icons and git integration | ls |
fd |
Fast, user-friendly find | find |
ripgrep (rg) |
Fast recursive grep | grep |
bat |
Cat with syntax highlighting | cat |
fzf |
Fuzzy finder | - |
zoxide |
Smart cd with frecency | cd |
btop |
Resource monitor | top, htop |
fastfetch |
System information display | neofetch |
jq |
JSON processor | - |
tokei |
Code statistics | - |
| Tool | Purpose |
|---|---|
git |
Version control |
lazygit |
Terminal UI for git |
Lazygit uses a shared Black & Pink theme.
| Setting | Value |
|---|---|
| Config location | $XDG_CONFIG_HOME/lazygit/config.yml |
| Windows config location | %LOCALAPPDATA%\lazygit\config.yml |
| Dotfile | dotfiles/lazygit/.config/lazygit/config.yml |
Windows Terminal is the native Windows terminal emulator.
| Setting | Value |
|---|---|
| Package | Microsoft.WindowsTerminal |
| Config source | windows/dotfiles/WindowsTerminal/settings.json |
| Config target | %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json |
| Profiles | PowerShell and Developer PowerShell for VS 2022 |
Neovim is the primary editor everywhere, including Windows, where $EDITOR/$VISUAL shell out to the nvim instance running inside WSL.
| Component | Value |
|---|---|
| Plugin manager | native vim.pack |
| Config location | $XDG_CONFIG_HOME/nvim/ |
| Dotfile | dotfiles/nvim/.config/nvim/ |
| Windows wrapper | windows/dotfiles/bin/nvim.cmd, installed to %LOCALAPPDATA%\Programs\bin and added to user PATH; shells into WSL via wsl.exe -u <user> -- zsh -ic nvim, converting file args with wslpath |
dotfiles/zed/ is kept in the repo for reference but is no longer installed or referenced by any install script.
Yazi is the terminal file manager for Unix-like environments and Arch WSL.
| Setting | Value |
|---|---|
| Theme | Black & Pink / configured flavor files |
| Config source | dotfiles/yazi/.config/yazi/config/ |
Dependencies include FFmpeg, 7-Zip, Poppler, resvg, ImageMagick, and Nerd Font symbols for previews and icons.
| Language/Runtime | Tool | Primary Target |
|---|---|---|
| Python | Python / Python Install Manager | Windows DevTools, Arch WSL |
| Go | go |
Arch WSL |
| Rust | rustup |
Windows DevTools, Arch WSL |
| JavaScript/TypeScript | bun |
Arch WSL |
| Java | jdk-openjdk, Maven |
Arch WSL |
| C/C++ | LLVM, Visual Studio Build Tools, Make, CMake | Windows DevTools, Arch WSL |
| Containers | Docker Desktop | Windows DevTools |
These packages are intended for Unix-like targets that receive the full shared toolchain, currently the optional Arch WSL setup. Ubuntu Server intentionally installs only a minimal shell baseline.
- Git
- curl
- wget
- rsync
- GNU Stow
- Zsh
- Oh My Zsh
- zsh autosuggestions
- zsh syntax highlighting
- custom zsh theme and plugin
- tar, unzip, zip, xz, file
- fontconfig / Nerd Font support
- Neovim
- Yazi
- Lazygit
- Herdr
- ripgrep
- fd
- fzf
- zoxide
- eza
- bat
- jq
- fastfetch
- btop
- tokei
- Python
- Go
- Rustup
- Bun
- OpenJDK
- Maven
- LLVM
- Make
- CMake
- base-devel on Arch
- FFmpeg
- 7-Zip
- Poppler
- resvg
- ImageMagick
Ubuntu Server is deliberately minimal and only installs the zsh/Oh My Zsh shell setup.
See ubuntu-server/install.sh for the complete installation script.
| Category | Packages |
|---|---|
| Core | ca-certificates, curl, git, zsh |
- Installs Oh My Zsh if missing.
- Installs
zsh-autosuggestionsandzsh-syntax-highlighting. - Copies the shared
blacknpinktheme andinayaplugin into Oh My Zsh custom directories. - Backs up an unmanaged
~/.zshrc, then installsdotfiles/zsh/.zshrc. - Adds zsh to
/etc/shellswhen needed and sets it as the default shell.
The Ubuntu Server installation does not include GNU Stow, development runtimes, Neovim, Yazi, Lazygit, extra CLI tools, GUI apps, Docker, or creative applications.
Windows uses Winget for packages and direct-copy dotfile installation. The installer prompts for optional package groups so a run can stay minimal or install the broader workstation setup.
See windows/install.ps1 for the complete installation script.
Installed from windows/dotfiles/winget/packages.json:
| Package Identifier | Purpose |
|---|---|
7zip.7zip |
Archive tooling |
Git.Git |
Version control |
Microsoft.PowerShell |
PowerShell Core |
Microsoft.WindowsTerminal |
Terminal emulator |
Microsoft.WSL |
Windows Subsystem for Linux |
JanDeDobbeleer.OhMyPosh |
Prompt renderer |
Microsoft.PowerToys |
Windows productivity utilities |
| Group | Package File | Contents |
|---|---|---|
| DevTools | packages_devtools.json |
Rustup, LLVM, Visual Studio Build Tools, Python Install Manager, Docker Desktop |
| Art | packages_art.json |
Blender, Krita, Kdenlive, Audacity, OBS Studio, MuseScore |
| Supplementary | packages_supplementary.json |
Handy, VirtualBox, LibreOffice |
| Arch WSL | setup-arch-wsl.ps1 |
Fresh Arch Linux WSL distro with shared dotfiles and Linux tools |
- PowerShell profile is copied to
$PROFILEand unblocked. - Oh My Posh theme is copied beside the PowerShell profile.
- nvim.cmd wrapper is copied to
%LOCALAPPDATA%\Programs\binand that directory is added to user PATH, sonvim(and$EDITOR/$VISUAL) shell into WSL nvim. - Windows Terminal settings are backed up and copied into the packaged Windows Terminal profile location.
- AutoHotkey scripts are copied to
%USERPROFILE%\AutoHotkey, andmyconfig.exeis added to Startup when present. - On the Arch WSL path only,
%UserProfile%\.wslconfigis written and a WSL logon shortcut is added to Startup. See Instance Persistence. PSReadLineis installed for the current user when missing.- Iosevka is installed through
oh-my-posh font install Iosevkawhen Oh My Posh is available. - LLVM is added to PATH when the DevTools group was installed and LLVM exists.
RegistryPreferences.regis imported.- Taskbar auto-hide is enabled.
- Shared/default desktop items are moved to the current user's desktop and removed from shared desktop locations.
| Package | Description | Target |
|---|---|---|
PowerShell |
Profile and Oh My Posh theme | $PROFILE and profile directory |
WindowsTerminal |
Windows Terminal settings | %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json |
AutoHotkey |
Personal AutoHotkey executable/script | %USERPROFILE%\AutoHotkey and Startup shortcut |
winget |
Core and optional package manifests | Imported by windows/install.ps1 |
Arch WSL is an optional Windows installer path. It creates a fresh archlinux distro and intentionally unregisters an existing distro with the same name before reinstalling.
| Phase | Behavior |
|---|---|
| Root bootstrap | Sets root password to root, initializes pacman keys, updates packages, installs base tools, enables sshd offline, writes initial /etc/wsl.conf with systemd=true |
| User setup | Creates a user named after the Windows user, enables wheel sudo, grants passwordless sudo, enables lingering so user services survive with no shell open, sets default user, generates en_US.UTF-8 locale |
| User packages and dotfiles | Installs Rust stable, builds paru, installs packages, configures Git for Windows SSH, installs Oh My Zsh, syncs and stows selected dotfiles, installs zsh plugins, runs t3-setup to install T3 Code and its background service, installs Claude Code, then installs the herdr Claude integration |
| Shell enforcement | Sets and verifies zsh as the WSL user's default shell |
| Instance persistence | Writes %UserProfile%\.wslconfig with instanceIdleTimeout=-1 and vmIdleTimeout=-1, adds a hidden logon shortcut that boots the distro, then restarts the instance under the new timeouts |
The T3 Code backend runs as a systemd user unit. Lingering keeps it alive with no shell open, but only from inside the instance; it cannot stop WSL from tearing the instance down. Two independent timeouts do that, and both must be disabled:
| Key | Section | Default | Effect |
|---|---|---|---|
instanceIdleTimeout |
[general] |
15000 ms | Stops the distro instance. Added in WSL 2.4.4. |
vmIdleTimeout |
[wsl2] |
60000 ms | Stops the utility VM. |
Setting only vmIdleTimeout leaves the instance timeout at its default, so the distro still stops 15-20 seconds after the last terminal closes.
Disabling the timeouts stops WSL shutting the instance down, but nothing starts it either. myconfig-wsl-autostart.lnk in the Startup folder supplies that half, running wsl.exe -d archlinux --exec /bin/true through a hidden powershell.exe because wsl.exe is a console program. windows/uninstall.ps1 removes both the shortcut and .wslconfig.
The Arch WSL setup installs packages through pacman and paru, including base-devel, rustup, zsh, rsync, stow, wsl2-ssh-agent, ripgrep, go, yazi-git, ffmpeg, 7zip, jq, poppler, fd, fzf, bat, zoxide, resvg, imagemagick, eza, llvm, bun, python, fastfetch, lazygit, jdk-openjdk, maven, make, cmake, btop, tokei, hunk-bin, herdr-bin, neovim, nodejs, and node-gyp.
Arch WSL syncs and stows these shared dotfile packages from the Windows-accessible repo path:
zshyazilazygitaiherdrnvim
myconfig/
├── README.md
├── SPECS.md
├── bootstrap.sh
├── bootstrap.ps1
├── dotfiles/
│ ├── ai/
│ ├── hermes/
│ ├── herdr/
│ ├── hyfetch/
│ ├── lazygit/
│ ├── nvim/
│ ├── qbt-search/
│ ├── wallpaper/
│ ├── yazi/
│ ├── zed/
│ └── zsh/
├── ubuntu-server/
│ ├── install.sh
│ └── uninstall.sh
└── windows/
├── install.ps1
├── setup-arch-wsl.ps1
├── uninstall.ps1
├── RegistryPreferences.reg
└── dotfiles/
├── AutoHotkey/
├── bin/
├── PowerShell/
├── WindowsTerminal/
└── winget/
| Package | Description | Primary Target |
|---|---|---|
ai |
Claude Code global instructions, skills, and settings | ~/.claude/ |
hermes |
Hermes config | $XDG_CONFIG_HOME/hermes/ |
herdr |
Herdr config | $XDG_CONFIG_HOME/herdr/ |
hyfetch |
Hyfetch config | $XDG_CONFIG_HOME/hyfetch.json |
lazygit |
Lazygit theme/config | $XDG_CONFIG_HOME/lazygit/ |
nvim |
Neovim config | $XDG_CONFIG_HOME/nvim/ |
qbt-search |
qBittorrent search plugins | Application-specific search plugin directory |
wallpaper |
Wallpaper assets | Wallpaper directory |
yazi |
Yazi config and flavor | $XDG_CONFIG_HOME/yazi/ |
zed |
Zed settings, keymap, and theme (unused, kept for reference) | Not installed by any script |
zsh |
.zshrc, Oh My Zsh theme, and custom plugin |
Home directory and Oh My Zsh custom paths |
The ai package ships settings.json without a hooks key on purpose. Arch WSL runs herdr integration install claude after stowing, and that command merges its own SessionStart hook into the file with a home-relative path. Windows copies only CLAUDE.md and skills/ from this package, because Claude Code runs only inside the Arch WSL distro.
| Target | Dotfile Strategy |
|---|---|
| Ubuntu Server | Direct copy of zsh files only |
| Windows | Direct copy of Windows configs |
| Arch WSL | Sync selected shared packages, remove conflicting target files, then stow --restow |