My personal development environment configuration optimized for Ubuntu 24.04 and WSL, designed to provide a consistent and easily reproducible experience across machines.
- Neovim: Lua configuration with LSP, treesitter, and WSL clipboard integration
- Tmux: Terminal multiplexer with Vim-style navigation and session persistence
- Zsh: Shell configuration with Oh-My-Zsh, aliases, and developer tooling setup
- Bash: Utility scripts, color-coded logging, and environment detection
- WSL Integration: Seamless clipboard sharing between Ubuntu and Windows
# Clone the repository
git clone https://github.com/Unique-Divine/dotfiles.git
cd dotfiles
# Install system packages used by the shell and Neovim.
# - build-essential: Used in almost everything
# - gh: GitHub CLI
# - libclang-dev: Needed so `cargo install tree-sitter-cli` can build.
# - tree-sitter-cli: Required by `nvim-treesitter` on the `main` branch.
# - wslu: Provides `wslview` (Example: gh pr view --web). This fixes the error,
# > exec: "xdg-open,x-www-browser,www-browser,wslview": executable file not found in $PATH
sudo apt install build-essential ripgrep gh libclang-dev wslu
# This might be different for you. The command comes from here:
# https://rustup.rs/
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install just
cargo install bat tree-sitter-cli sd
# Create symbolic links for configurations
source zsh/zshenv # internally runs $DOTFILES/symlinks.sh
# Install development tools
bun install
just setupAfter installing nvim, restore Neovim plugins from the lazy.nvim lockfile:
nvim --headless "+Lazy! restore" +qaThis dotfiles repo uses symbolic links to maintain a single source of truth for all configurations. The advantages of this approach include:
- Version control: Track changes to your configurations over time
- Portability: Quickly set up identical environments across machines
- Centralization: Modify configs in one place and have changes propagate
- Safety: Original system files aren't modified, only linked to
- Maintenance: Updates to the repo instantly apply to all linked machines
The symlinks.sh script handles creating all necessary symbolic links to connect the configurations in this repo to their expected locations in your home directory and .config folder.
just sync runs the established shell bootstrap, applies portable Codex
defaults, and synchronizes managed AI skills. just health does not write: it
checks required commands and reports Codex or skills-sync drift with a nonzero
exit status.
just skills-sync --run treats $HOME/.cursor/skills as the canonical runtime
directory and also copies all skills to $HOME/.agents/skills for Codex CLI.
The Codex destination is created and marked as managed on first use; an
existing unrelated non-empty directory is rejected rather than overwritten.
See the Codex skills documentation.
- Light/dark theme toggle (Catppuccin/OneDark)
- Treesitter with support for modern languages including Astro
- LSP with auto-installation of language servers
- Harpoon, Telescope, and other navigation enhancements
- Tmux with Dracula theme and plugin manager
- Zsh configured for Node.js, Rust, Go, and Python development
- Bun JavaScript/TypeScript runtime integration
tree-sitter-clisupport for Neovim parser installation on themainbranch
herdr/config.toml is the managed configuration source.
symlinks.sh links only this file to ~/.config/herdr/config.toml; Herdr's
sessions and logs remain runtime-owned and are never linked or versioned.
Like the existing dotfiles links, sync replaces the runtime config with this
managed source. Backup/preservation or force-mode policies are deferred.
The checked-in file is the complete annotated baseline generated by Herdr
0.8.0. Its options are commented except for upstream's explicit
pane_history = false default, so it preserves built-in behavior until an
option is deliberately changed. Refresh it only when deliberately adopting a
new Herdr baseline:
herdr --default-configThe upstream source is available as the pinned lib-herdr submodule for local
documentation and implementation inspection. Initialize it after cloning
dotfiles with git submodule update --init --recursive.
codex/config.ts maintains portable defaults in
$HOME/.codex/config.toml while preserving local project and onboarding
state. When present, $HOME/.cursor/mcp.json supplies same-named MCP servers;
other Codex MCP servers remain local. Run bun run codex/config.ts for its
usage and options.
- A persistent Rust bridge that keeps one PowerShell clipboard process warm
pbcopy,pbpaste,wsl-pbcopy, andwsl-pbpasteare symlinks to the one installed bridge binary; it dispatches by the command name- Lossless UTF-8 text across the WSL/Windows boundary, including emoji and non-BMP Unicode; PowerShell performs the internal UTF-16 conversion
just syncinstalls~/.local/bin/wsl-clipboardon WSL; its daemon starts only on the first copy or paste requestlegacy-pbcopyandlegacy-pbpasteretain the old one-shot commands for diagnostics and performance comparison
- Ubuntu 24.04 (or compatible) on WSL2
- Neovim v10.0.4+ (ARM64 AppImage included)
- Zsh with Oh-My-Zsh
- Tmux
- Bun and Node.js
- Cargo/Rust tools
- Just command runner (
cargo install just) libclang-devfor buildingtree-sitter-clilua5.1andluarocksfor Lazy/LuaRocks health checkstree-sitter-cli(cargo install tree-sitter-cli)
# Run all tests
just test
# or
bun test
# Test clipboard functionality
bun test zsh/clipboard.test.ts