{"id":29198112,"url":"https://github.com/masonegger/homedir","last_synced_at":"2026-07-22T00:33:38.515Z","repository":{"id":91503932,"uuid":"112869523","full_name":"MasonEgger/homedir","owner":"MasonEgger","description":"My personal dotfiles and homedir scripts","archived":false,"fork":false,"pushed_at":"2026-07-20T03:29:46.000Z","size":415,"stargazers_count":6,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-20T05:17:19.576Z","etag":null,"topics":["claude-code","dotfiles","homedir"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MasonEgger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-12-02T19:13:45.000Z","updated_at":"2026-07-20T03:29:48.000Z","dependencies_parsed_at":"2026-01-05T18:00:04.308Z","dependency_job_id":"e9195583-1f9b-4b99-9c50-6a02bb26f1f1","html_url":"https://github.com/MasonEgger/homedir","commit_stats":null,"previous_names":["masonegger/homedir"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MasonEgger/homedir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MasonEgger%2Fhomedir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MasonEgger%2Fhomedir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MasonEgger%2Fhomedir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MasonEgger%2Fhomedir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MasonEgger","download_url":"https://codeload.github.com/MasonEgger/homedir/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MasonEgger%2Fhomedir/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35742291,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-21T02:00:06.728Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","dotfiles","homedir"],"created_at":"2025-07-02T08:41:14.191Z","updated_at":"2026-07-22T00:33:38.509Z","avatar_url":"https://github.com/MasonEgger.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# homedir\n\nPersonal dotfiles and home directory configuration for consistent development environments across machines.\n\n## Overview\n\nThis repository contains my personal shell configurations, editor settings, and custom utility scripts that I use to quickly set up a productive development environment on new machines. It includes configurations for `zsh` with [Oh My Zsh](https://ohmyz.sh/), Vim settings, and various helpful aliases and tools.\n\n## Setup\n\n### Ansible-based Setup\n\n**Sync dev environment** (current user, any machine):\n```bash\n$ cd\n$ git clone https://github.com/MasonEgger/homedir.git\n$ cd homedir\n$ ansible-playbook ansible/setup.yml    # Install everything for current user\n```\n\n**Fresh mmegger user install** (remote Debian/Ubuntu server):\n```bash\nansible-playbook ansible/setup.yml --tags mmegger    # Full mmegger user setup\n```\n\nThe `mmegger` tag is self-contained: creates the user, hardens SSH, and then installs all packages, dotfiles, and tools for the mmegger user.\n\n**Modular Installation Options (sync scenario):**\n```bash\n# Install specific components for the current user\nansible-playbook ansible/setup.yml --tags packages     # Only install packages\nansible-playbook ansible/setup.yml --tags dotfiles     # Only install core dotfiles\nansible-playbook ansible/setup.yml --tags claude       # Only install .claude directory\nansible-playbook ansible/setup.yml --tags homedir      # Only install .homedir scripts\n\n# Combine multiple components\nansible-playbook ansible/setup.yml --tags packages,dotfiles\nansible-playbook ansible/setup.yml --tags claude,homedir\n```\n\n**Check Mode and Preview Options:**\n```bash\n# See what would change without making changes\nansible-playbook ansible/setup.yml --check\nansible-playbook ansible/setup.yml --tags dotfiles --check\n\n# Show detailed before/after diffs of file changes\nansible-playbook ansible/setup.yml --check --diff\nansible-playbook ansible/setup.yml --tags dotfiles --check --diff\n```\n\n**Additional Options:**\n- `--check` - Preview changes without making them\n- `--diff` - Show detailed before/after diffs\n\n**Features:**\n- **Modular installation**: Install only the components you need (packages, dotfiles, claude, homedir)\n- **Cross-platform package management**: Automatically installs development tools via Homebrew (macOS) or apt (Ubuntu/Debian)\n- **Check mode support**: Preview changes before making them with `--check` and `--diff`\n- **Idempotent**: Safe to run multiple times, only makes necessary changes\n\n## What's Included\n\n### Shell Configuration (`.zshrc`)\n\n| Alias/Command | Description | Usage |\n|---------------|-------------|-------|\n| `cdr` | Navigate to git repository root | `cdr` |\n| `..` | Go up one directory | `..` |\n| `...` | Go up two directories | `...` |\n| `....` | Go up three directories | `....` |\n| `.....` | Go up four directories | `.....` |\n| `......` | Go up five directories | `......` |\n| `venv-on` | Activate Python virtual environment at git root | `venv-on` |\n| `python` | Alias for python3 | `python \u003cscript.py\u003e` |\n| `django` | Shortcut for python manage.py | `django \u003ccommand\u003e` |\n| `uuid` | Generate lowercase UUID with colorful output (using lolcat) | `uuid` |\n| `tl` | List active tmux sessions | `tl` |\n| `ta` | Attach to a tmux session (last/default if no name) | `ta [session]` |\n| `tn` | Create a new tmux session (unnamed if no name) | `tn [session]` |\n| `ts` | Switch to another tmux session from inside tmux (last session if no name) | `ts [session]` |\n| `td` | Detach from the current tmux session | `td` |\n\n**Additional Configuration:**\n- **Shell**: Zsh with Oh My Zsh (geoffgarside theme)\n- **Plugins**: git\n- **Path additions**: `~/.homedir`\n- **Local configuration**: `~/.zshrc.local` for machine-specific settings (auto-created, git-ignored)\n- **Other**: thefuck alias integration, GPG TTY export\n\n### Editor Configuration (`.vimrc`)\n\n| Configuration | Vim Command | Description |\n|---------------|-------------|-------------|\n| Command height | `set cmdheight=2` | Enhanced command line display area |\n| Backspace behavior | `set backspace=2` | Enable proper backspace functionality |\n| Search highlighting | `set hlsearch` | Highlight search results |\n| Line numbers | `set number` | Display line numbers |\n| Ruler display | `set ruler` | Show cursor position in status line |\n| Column marker | `set cc=80` | 80-character column marker |\n| Tab expansion | `set expandtab` | Convert tabs to spaces |\n| Tab size | `set ts=4` | 4-space tab width |\n| Color scheme | `colorscheme slate` | Slate color theme |\n| Syntax highlighting | `syntax on` | Enable syntax highlighting |\n\n### Terminal Multiplexer Configuration (`.tmux.conf`)\n- **Mouse support**: Enabled for scrolling and pane selection\n- **Function key bindings**:\n  - `F2` - Create new window\n  - `F3` - Previous window\n  - `F4` - Next window\n  - `Ctrl+F2` - Horizontal split\n  - `Shift+F2` - Vertical split\n- **Pane navigation**: `Shift+Arrow` keys to move between panes\n- **Visual**: Magenta status bar with black text, colored pane borders\n- **Settings**: 10,000 line scrollback buffer, 256-color support, windows numbered from 1\n\n### Custom Tools (`.homedir/`)\n\n| Command | Description | Arguments | Usage Example |\n|---------|-------------|-----------|---------------|\n| `lmsify` | Convert GitHub Flavored Markdown to HTML for LMS publication (copies to clipboard using `pbcopy`) | `\u003cfile.md\u003e` - Markdown file to convert | `lmsify lesson.md` |\n| `wordcount` | Count words in files/directories, excluding Markdown code blocks | `\u003cpath\u003e [options]` - File or directory to process with various options | `wordcount README.md` or `wordcount . -r -f json` |\n| `my-tools` | Display help for available custom tools | None | `my-tools` |\n| `claude-plugins` | Install or update Claude Code plugins from official and personal marketplaces | None | `claude-plugins` |\n\n### Claude Settings (`.claude/`)\n\n| File | Description |\n|------|-------------|\n| `CLAUDE.md` | Development guidelines for Claude AI assistant (separate from root CLAUDE.md) |\n| `settings.json` | Global Claude Code configuration |\n| `skills/python/` | Python development standards skill (toolchain, TDD, CLI scripts, documentation) |\n\nClaude Code plugins (BPE workflow, writing toolkit, productivity commands) live in a separate repository: [MasonEgger/claude-code-plugin](https://github.com/MasonEgger/claude-code-plugin). The `claude-plugins` script in `.homedir/` handles installing them from that marketplace.\n\n## File Structure\n\n```\n.\n├── .claude/                      # Claude AI assistant configuration\n│   ├── CLAUDE.md                 # Claude-specific documentation\n│   ├── settings.json             # Global Claude settings\n│   └── skills/                   # Claude Code skills\n│       └── python/               # Python development standards\n│           ├── SKILL.md\n│           └── references/       # Toolchain, TDD, CLI, docs guides\n├── .homedir/                     # Custom utility scripts\n│   ├── claude-plugins            # Claude Code plugin installer\n│   ├── lmsify                    # Markdown to HTML converter\n│   ├── my-tools                  # Tool help display\n│   └── wordcount                 # Word count utility\n├── ansible/                      # Ansible automation setup\n│   ├── setup.yml                 # Main Ansible playbook (orchestration only)\n│   ├── group_vars/               # Variable definitions\n│   │   └── all.yml               # Package lists and configuration\n│   ├── tasks/                    # Modular task definitions\n│   │   ├── packages.yml          # System packages (apt/brew)\n│   │   ├── user-tools.yml        # Per-user tools (Oh My Zsh, Claude CLI, uv)\n│   │   ├── dotfiles.yml          # Core dotfiles installation\n│   │   ├── claude.yml            # .claude directory + plugin installation\n│   │   ├── homedir.yml           # .homedir scripts installation\n│   │   ├── vale.yml              # Vale prose linter\n│   │   ├── git-hooks.yml         # Global git hooks\n│   │   ├── tailscale.yml         # Tailscale VPN\n│   │   └── mmegger.yml           # Full user provisioning\n│   ├── ansible.cfg               # Ansible configuration\n│   ├── hosts                     # Localhost inventory\n│   └── requirements.yml          # External role dependencies\n├── .tmux.conf                    # Tmux terminal multiplexer configuration\n├── .vimrc                        # Vim configuration\n├── .zshrc                        # Zsh configuration with aliases\n├── .zshrc.local.example          # Template for machine-specific zsh configuration\n├── CLAUDE.md                     # Instructions for Claude AI assistant\n└── README.md                     # This file\n```\n\n## Machine-Specific Configuration\n\n### Using `.zshrc.local`\n\nThe `.zshrc.local` file allows you to maintain machine-specific settings without modifying the tracked `.zshrc` file. This is perfect for:\n\n- **API keys and secrets** (OpenAI, GitHub tokens, AWS credentials)\n- **Machine-specific PATH additions** (local binaries, custom tools)\n- **Local aliases** (project shortcuts specific to this machine)\n- **Environment variables** (DEBUG flags, local development settings)\n- **Override repository defaults** (custom themes, plugins)\n\n**Setup**:\n- Automatically created during Ansible setup if it doesn't exist\n- Ignored by git (safe for secrets and machine-specific settings)\n- Never overwritten when re-running `ansible-playbook`\n- Sourced at the end of `.zshrc` (settings here override repository defaults)\n\n**Usage**:\n```bash\n# Edit your local configuration\nvim ~/.zshrc.local\n\n# Example content:\nexport OPENAI_API_KEY=\"sk-...\"\nalias myproject=\"cd ~/Projects/my-special-project\"\nexport PATH=\"$HOME/bin:$PATH\"\n```\n\nSee `.zshrc.local.example` in the repository for more examples.\n\n## Notes\n\n- **Package Dependencies**: The Ansible setup automatically installs required packages including `lolcat`, development tools, and `uv`\n- The `lmsify` command requires `lessonmd` tool to be installed (not included in automated setup)\n- The `wordcount` script uses `uv` for Python script execution and supports multiple output formats (text, JSON, CSV)\n- All custom scripts in `.homedir/` are executable and added to PATH\n- **Ansible Requirement**: Ensure Ansible is installed (`pip install ansible` or `brew install ansible`)\n- **Safe re-runs**: Running `ansible-playbook ansible/setup.yml` multiple times is safe and idempotent\n\n## Contributing\n\nThis is a personal configuration repository, but feel free to fork and adapt for your own use. When making changes:\n- Test new aliases and scripts locally before committing\n- Ensure shell scripts are executable (`chmod +x`)\n- Avoid machine-specific configurations\n\n## Claude.md\n\nThe CLAUDE.md file provides guidance to Claude Code (claude.ai/code) when working with this repository. Claude.md crafted by myself, and shamelessly taken from [harperreed](https://github.com/harperreed/dotfiles/tree/master/.claude)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmasonegger%2Fhomedir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmasonegger%2Fhomedir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmasonegger%2Fhomedir/lists"}