My dotfiles & environment setup
Versioned Linux configs I use day to day.
| Path | Contents |
|---|---|
home/ |
Bash, git, Cursor (rules, agents, skills) |
config/ |
bat, btop, htop, tmux, ghostty |
install.sh |
Symlink home/ and config/ into place |
.
├── home/
│ ├── .bashrc, .bashrc.tools, .bashrc.ghostty, .bash_prompt, .bash_aliases, .bash_functions, .inputrc
│ ├── .gitconfig, .gitmessage
│ └── .cursor/
│ ├── agents/
│ ├── rules/
│ └── skills/
├── config/
│ ├── bat/
│ ├── btop/
│ ├── htop/
│ ├── tmux/
│ └── ghostty/
├── install.sh
├── Makefile # local stand-ins for CI (`make help`)
└── .github/ # CI & repo scripts (not installed)
Warning
This symlinks configs into your home directory. Anything replaced is moved to ~/.dotfiles-backup/. Use at your own risk.
make install| Command | What it links |
|---|---|
make install |
Full tree (including your git identity + gpg.conf) |
make install-shell-only |
Shell + most config/ — no .gitconfig / .gitmessage (safe for shared hosts / friends) |
make install-shell-with-git |
Shell-only plus your git identity (machine that should commit as you) |
.cursor children link individually into ~/.cursor/ so Cursor-managed paths are not replaced wholesale.
Same commands CI runs locally. make prints targets; make check runs the full set (ShellCheck, shfmt, install smoke/idempotent, skills drift).
make checkCI already runs Gitleaks on every push/PR, plus ShellCheck/shfmt in Lint. Locally pre-commit runs those engines (and actionlint) on staged files:
# once per clone (pre-commit package required: apt/pip/brew)
make pre-commit-install # or: pre-commit installAfter that, every git commit runs the configured hooks on staged changes (Gitleaks, ShellCheck -S error except home/.cursor/skills/, shfmt -d -i 2 on install.sh and .github/scripts/, actionlint on .github/workflows/). Skip one hook with SKIP=gitleaks git commit …. Manual full-tree scan: make gitleaks or pre-commit run <hook> --all-files.
Skills under home/.cursor/skills/ come from versioned upstreams (see .github/upstreams/) plus any local-only dirs you add by hand. Sync with ./.github/scripts/sync-upstreams.sh --pull.
| Skill dirs | Upstream | Path in upstream | Local overlay |
|---|---|---|---|
home/.cursor/skills/* (default set) |
addyosmani/agent-skills (MIT) | skills/ |
disable-model-invocation: true, idea-refine path fix |
home/.cursor/skills/ui-ux-pro-max/ |
nextlevelbuilder/ui-ux-pro-max-skill (MIT) | .claude/skills/ui-ux-pro-max/ |
search.py path rewritten to $HOME/.cursor/skills/... (scripts/ vendored for linguist) |
home/.cursor/skills/i-have-adhd/ |
ayghri/i-have-adhd (MIT) | .cursor/skills/i-have-adhd/ |
none (disable-model-invocation already in upstream) |
home/.cursor/skills/resume-builder/ |
dabydat/resume-builder-skill (MIT) | skill/ |
disable-model-invocation: true |
home/.cursor/skills/find-skills/ |
vercel-labs/skills (MIT) | skills/find-skills/ |
disable-model-invocation: true |
home/.cursor/skills/* (mattpocock set) |
mattpocock/skills (MIT) | skills/engineering/, skills/productivity/ |
disable-model-invocation: true |
home/.cursor/skills/* (anthropics example set) |
anthropics/skills (Apache 2.0) | skills/ |
disable-model-invocation: true; skip docx/pdf/pptx/xlsx (source-available, not OSS) |
home/.cursor/skills/k6* |
grafana/skills (Apache 2.0) | skills/grafana-k6/ |
disable-model-invocation: true |
Rules and any skill dirs not listed above are mine (unmanaged by sync).
This repository is MIT licensed. Synced Cursor skills remain under their upstream licenses (see table above).