Personal dotfiles and workstation bootstrap for my day-to-day development setup.
It is centered on Neovim, shell tooling, tmux, terminal apps, Codex and OpenCode configuration, and language support for Go, Java, Lua, Python, and SQL.
Warning
This is a personal, opinionated setup that changes often. The bootstrap
scripts assume my project layout under ~/Projects/IlyasYOY, clone a few
personal repositories, manage shell startup files, and still include
macOS-specific desktop tooling. Review the scripts before running them on a
machine you care about.
This repository is primarily built for macOS, with a smaller Raspberry Pi bootstrap path for Raspberry Pi OS or Debian-based Linux on Raspberry Pi hardware.
- macOS installs Homebrew formulae, casks, and App Store apps from
Brewfile.mac,Brewfile.mac.cask, andBrewfile.mac.mas, then links desktop configuration such as WezTerm, Hammerspoon, and Amethyst. - Raspberry Pi runs apt-based system bootstrap, configures the
sing-boxrepository, installs Linuxbrew when needed, and installs a smaller CLI/dev tool set fromBrewfile.raspberry-pi.
config/nvim— full Neovim configuration with eagervim.packregistration, Treesitter, LSP/DAP, snippets,fzf-lua, Git tooling, and database helpers.config/nvim-minimal— minimal Neovim setup for reproducing issues.sh— shared shell helpers plus install and update entrypoints.config/wezterm,config/hammerspoon,config/gnupg,config/.tmux.conf,config/.amethyst.yml,config/.vimrc— terminal, desktop, and CLI configuration tracked in the repo.config/agent/skills— shared portable skills linked into both Codex and OpenCode. Any immediate child directory withSKILL.mdis installed.config/codex— Codex instructions, rules, and Codex-only skills that read local Codex session state.config/opencode— checked-in OpenCode instructions, commands, plugins, and OpenCode-only skills..agents/skills— repository-local agent skills, includingsetup-codexandsetup-opencode, used only while working in this checkout.Brewfile.mac,Brewfile.mac.cask,Brewfile.mac.mas,Brewfile.raspberry-pi— package manifests used by the bootstrap scripts.bin— small personal utilities and executable helpers.
Before running the bootstrap flow, make sure you have:
- macOS or Raspberry Pi OS / Debian-based Linux on a Raspberry Pi
- Git
curlzshon macOS orbashon Raspberry Pi
On macOS, Homebrew is expected to be available before running make install.
On Raspberry Pi, Homebrew is bootstrapped by the installer itself, but git,
curl, sudo, and a Debian-compatible apt environment are still assumed.
mkdir -pv ~/Projects/IlyasYOY
cd ~/Projects/IlyasYOY
git clone git@github.com:IlyasYOY/dotfiles.git dotfiles
cd dotfiles
make installmake install runs sh/setup/install.sh. The install flow:
- Creates the expected project directories under
~/Projects. - Installs platform dependencies from the relevant Brewfiles.
- Clones notes and a small set of personal repositories into
~/Projects/IlyasYOY. - Links tracked config into
~/.configand$HOME. - Appends shell startup lines to the active rc file:
~/.zshrcon macOS and~/.bashrcon Raspberry Pi. - Configures Git defaults.
- Installs and configures
SDKMAN,gvm, andfnm. - Sets up tmux TPM, clones the password store, and links Codex and OpenCode
instructions, commands, rules, plugins, and global skills into
~/.codexand~/.config/opencode. User config files are left unchanged.
On macOS, the installer uses:
Brewfile.macfor formulae, including the standard HomebrewopencodeformulaBrewfile.mac.caskfor casks, including the Codex desktop casksBrewfile.mac.masfor App Store installs
On Raspberry Pi, the installer:
- runs
apt-get updateandapt-get upgrade -y - installs Homebrew and toolchain prerequisites with
apt(includingbisonforgvm) - configures the official
sing-boxapt repository and installssing-box - installs Linuxbrew if it is not already present
- installs Homebrew-managed dependencies from
Brewfile.raspberry-pi - installs Node.js and
npmwithfnmwhen they are not already available - writes shell startup config to
~/.bashrcinstead of~/.zshrc
The Brewfile-backed install steps use:
brew bundle install --file <brewfile> --jobs auto --no-upgradeThat keeps make install focused on missing dependencies instead of upgrading
everything already on the machine.
Setup debug logs are hidden by default. To include them, run:
make install VERBOSE=1luacheck is installed by the bootstrap scripts instead of Mason. Mason's
LuaRocks package currently resolves against Lua 5.5 on newer systems, which
breaks luacheck dependency resolution upstream, so the Neovim config no
longer asks Mason to manage that tool.
Main links created by the installer:
config/nvim->~/.config/nvimconfig/nvim-minimal->~/.config/nvim-minimalconfig/gnupg/gpg-agent.conf->~/.gnupg/gpg-agent.confconfig/.gitignore-global->~/.config/git/ignoreconfig/.golangci.yml->~/.golangci.ymlconfig/codex/AGENTS.md->~/.codex/AGENTS.mdconfig/codex/rules/default.rules->~/.codex/rules/default.rules- shared portable skills from
config/agent/skills/<skill>/SKILL.md->~/.codex/skills/IlyasYOY/<skill>and~/.config/opencode/skills/<skill> - Codex-only skills from
config/codex/skills/<skill>/SKILL.md->~/.codex/skills/IlyasYOY/<skill> - OpenCode-only skills from
config/opencode/skills/<skill>/SKILL.md->~/.config/opencode/skills/<skill> config/opencode/AGENTS.md->~/.config/opencode/AGENTS.mdconfig/opencode/commands->~/.config/opencode/commandsconfig/.tmux.conf->~/.tmux.confconfig/.vimrc->~/.vimrc
make install does not edit ~/.codex/config.toml. From this repository, run
$setup-codex to compare that file with the reference stored in
.agents/skills/setup-codex, review a redacted grouped diff, choose which
groups to apply, create a backup, and validate the result with codex doctor.
Codex discovers this skill from the repository-local .agents/skills tree.
The bootstrap also clones and installs the local t-invest-mcp Go binary, and
make update refreshes its repository and reinstalls the binary. The
setup-codex and setup-opencode references register Singularity's official
remote MCP server at https://mcp.singularity-app.com/mcp; no local
checkout, custom binary, or token environment variable is required.
The setup-codex reference registers T-Invest only in Codex as the t-invest
MCP server. It requires
T_INVEST_TOKEN and T_INVEST_ENV (prod or sandbox) in the environment
before Codex starts; optional
T_INVEST_ACCOUNT_ID, T_INVEST_TIMEOUT, T_INVEST_MAX_RESPONSE_BYTES, and
T_INVEST_APP_NAME values are forwarded when present. The bootstrap stores no
token values. Start a new Codex session after changing these variables or the
MCP configuration.
Shared portable skills such as caveman, git-commit, and hammerspoon are
linked from config/agent/skills. Codex-only session-history skills stay under
config/codex/skills because they read ~/.codex/state_5.sqlite and rollout
files. Setup discovers installable skills from immediate child directories that
contain SKILL.md.
Codex-only third-party skills are configured in
config/codex/external-skills.conf. Each repository is pinned to a full commit
hash and may restrict discovery to selected repository paths. make install
materializes the accepted commits under
~/.local/share/ilyasyoy/codex-skills and links every selected SKILL.md
directory into ~/.codex/skills/IlyasYOY. make update compares the pinned
commit with the configured upstream branch and requires an interactive review
and confirmation before changing any installed skill or commit pin.
make install does not edit ~/.config/opencode/opencode.json. OpenCode
discovers .agents/skills/setup-opencode through its native repository-local
skill directory. Invoke that skill to compare the global config with its
reference, review a redacted grouped diff, choose changes, create a backup,
and validate the result with OpenCode's real config loader.
Global OpenCode skill links still include shared portable skills from
config/agent/skills and OpenCode-only session-history implementations from
config/opencode/skills. The installer does not delete Codex sessions, auth,
app state, plugins, memories, or OpenCode state.
macOS-only links created by the installer:
config/wezterm->~/.config/weztermconfig/hammerspoon->~/.hammerspoonconfig/.amethyst.yml->~/.amethyst.yml
This repo can be a good base, but several parts of it are still wired to my personal machines, paths, repositories, and services. Review these before you try to use it unchanged.
- Project layout: the setup scripts assume
~/Projects/IlyasYOYplus~/Projects/Work, with notes living in~/Projects/kb-store. If you use a different layout, update the path constants insh/setup/helpers.sh. - Notes:
sh/setup/install.shinitializes~/Projects/kb-storeas a local git repository when it is missing. - Personal repositories:
sh/setup/install.shandsh/setup/update.shclone and update the personal Neovim plugins registered inpack.lua, plus other projects such asgit-link.nvim,monotask, andpassword-store. Remove or replace those entries if you do not own those repositories. - Secrets and external services: the bootstrap clones a personal password-store repository and shell helpers assume that store is available. If you do not use that exact setup, remove or replace those entries.
- Java setup: Neovim Java support looks for SDKMAN-managed JDKs in
~/.sdkman/candidates/java/. The current helper supports JDK8,11,17,21,23, and25, and prefers21when available. If none of those are installed,jdtlsis skipped.
- Notes workflow:
config/nvim/after/plugin/obs.luapointsobs.nvimat~/Projects/kb-store, and shell aliases/helpers also assume that notes location. Change those paths if you use a different vault, or disable the integration. - Local plugin development:
config/nvim/lua/ilyasyoy/pack.luaprefers local checkouts under~/Projects/IlyasYOY/<plugin>before falling back to GitHub. That is convenient for my plugin workflow, but you may want to remove those local overrides. - Shell defaults:
sh/exports.shsets macOS-specific Colima and Docker socket environment variables. If you do not use Colima, review or remove those exports. - Packages and apps: the Brewfiles and
masentries reflect my machine, not a minimal universal setup. Trim them to the tools and desktop apps you actually want.
make updatemake update runs sh/setup/update.sh.
- On macOS it updates Homebrew itself, formulae, casks, App Store apps, tracked local repositories, and tmux plugins.
- On Raspberry Pi it updates apt packages, Homebrew, Homebrew packages, tracked local repositories, and tmux plugins.
Update debug logs are hidden by default. To include them, run:
make update VERBOSE=1make check
make check-lua
make check-shell
make check-python
make format-luamake checkruns the first-pass validation for Lua, shell, and Python skill files and is the same check target used by CI.make check-luaruns the Lua lint and formatting checks.make check-shellrunsshellcheckfor shell scripts and shell fragments.make check-pythonruns the AI session coach's standard-library tests.make format-luaformats Lua files withstylua.