$git clone https://github.com/jmagar/claude-homelabComprehensive Agents, Commands, Hooks, and Skills for homelab service management - media automation, infrastructure monitoring, document management, and more
| 1 | # Claude Homelab |
| 2 | |
| 3 | Current release: 1.4.0. |
| 4 | |
| 5 | Homelab plugin hub for Claude Code, Codex, and Gemini. This repository is the source of truth for the `homelab-core` plugin, bundled skill-only integrations, agents, commands, and shared credential bootstrapping. |
| 6 | |
| 7 | ## Overview |
| 8 | |
| 9 | `claude-homelab` serves three roles at once: |
| 10 | |
| 11 | - The `homelab-core` plugin published through the Claude marketplace |
| 12 | - The canonical mono-repo for 16 bundled skill-only service integrations |
| 13 | - The source for Codex and Gemini extension manifests that mirror the same workflow surface |
| 14 | |
| 15 | The repo root is the plugin root. Do not edit generated copies in `~/.claude/` or `~/.claude/plugins/cache/` directly. |
| 16 | |
| 17 | ## Installation |
| 18 | |
| 19 | ### Claude marketplace |
| 20 | |
| 21 | ```bash |
| 22 | /plugin marketplace add jmagar/claude-homelab |
| 23 | /plugin install homelab-core @jmagar-claude-homelab |
| 24 | ``` |
| 25 | |
| 26 | After install, Claude Code downloads the plugin into `~/.claude/plugins/cache/`. No symlinks are created on this path. |
| 27 | |
| 28 | ### Bash / symlink install |
| 29 | |
| 30 | ```bash |
| 31 | curl -sSL https://raw.githubusercontent.com/jmagar/claude-homelab/main/scripts/install.sh | bash |
| 32 | ``` |
| 33 | |
| 34 | Or, if you already have the repo cloned: |
| 35 | |
| 36 | ```bash |
| 37 | ./scripts/install.sh |
| 38 | ``` |
| 39 | |
| 40 | The installer: |
| 41 | |
| 42 | 1. Checks prerequisites (`git`, `jq`, `curl`) |
| 43 | 2. Clones the repo to `~/claude-homelab` (or pulls if it exists) |
| 44 | 3. Runs `setup-creds.sh` — creates `~/.claude-homelab/.env` from `.env.example` with `chmod 600` |
| 45 | 4. Runs `setup-symlinks.sh` — symlinks skills, agents, and commands into `~/.claude/` |
| 46 | 5. Runs `verify.sh` — confirms every symlink and required file is in place |
| 47 | 6. Prints next steps |
| 48 | |
| 49 | ## Credential Model |
| 50 | |
| 51 | All credentials for every service live in a single file: |
| 52 | |
| 53 | ``` |
| 54 | ~/.claude-homelab/.env |
| 55 | ``` |
| 56 | |
| 57 | This file is created from `.env.example` at install time and is never committed. Set it up interactively after install: |
| 58 | |
| 59 | ```bash |
| 60 | # Interactive wizard (preferred) |
| 61 | # Open Claude Code and run: |
| 62 | /homelab-core:setup |
| 63 | |
| 64 | # Or configure manually |
| 65 | $EDITOR ~/.claude-homelab/.env |
| 66 | ``` |
| 67 | |
| 68 | Security requirements: |
| 69 | |
| 70 | - `~/.claude-homelab/.env` must have `chmod 600` (owner read/write only) |
| 71 | - Never commit `.env` — it is gitignored |
| 72 | - Never log credentials, even in debug mode |
| 73 | - Use `.env.example` as the template (tracked in git, placeholder values only) |
| 74 | |
| 75 | All service scripts load credentials via `scripts/load-env.sh`: |
| 76 | |
| 77 | ```bash |
| 78 | source "${CLAUDE_PLUGIN_ROOT:-$HOME/claude-homelab}/scripts/load-env.sh" |
| 79 | load_env_file || exit 1 |
| 80 | validate_env_vars "SERVICE_URL" "SERVICE_API_KEY" |
| 81 | ``` |
| 82 | |
| 83 | ### Environment Variable Reference |
| 84 | |
| 85 | Variables are grouped by service. Copy `.env.example` to `~/.claude-homelab/.env` and replace placeholder values. |
| 86 | |
| 87 | #### Media |
| 88 | |
| 89 | | Variable | Required | Description | |
| 90 | |---|---|---| |
| 91 | | `PLEX_URL` | yes | Plex server base URL | |
| 92 | | `PLEX_TOKEN` | yes | Plex authentication token | |
| 93 | | `OVERSEERR_URL` | yes | Overseerr base URL (skill) | |
| 94 | | `OVERSEERR_API_KEY` | yes | Overseerr API key (skill) | |
| 95 | | `RADARR_URL` | yes | Radarr base URL | |
| 96 | | `RADARR_API_KEY` | yes | Radarr API key | |
| 97 | | `RADARR_DEFAULT_QUALITY_PROFILE` | no | Default quality profile ID (default: `1`) | |
| 98 | | `SONARR_URL` | yes | Sonarr base URL | |
| 99 | | `SONARR_API_KEY` | yes | Sonarr API key | |
| 100 | | `SONARR_DEFAULT_QUALITY_PROFILE` | no | Default quality profile ID (default: `1`) | |
| 101 | | `PROWLARR_URL` | yes | Prowlarr base URL | |
| 102 | | `PROWLARR_API_KEY` | yes | Prowlarr API key | |
| 103 | | `TAUTULLI_URL` | yes | Tautulli base URL | |
| 104 | | `TAUTULLI_API_KEY` | yes | Tautulli API key | |
| 105 | |
| 106 | #### Downloads |
| 107 | |
| 108 | | Variable | Required | Description | |
| 109 | |---|---|---| |
| 110 | | `SABNZBD_URL` | yes | SABnzbd base URL | |
| 111 | | `SABNZBD_API_KEY` | yes | SABnzbd API key | |
| 112 | | `QBITTORRENT_URL` | yes | qBittorrent WebUI URL | |
| 113 | | `QBITTORRENT_USERNAME` | yes | qBittorrent username | |
| 114 | | `QBITTORRENT_PASSWORD` | yes | qBittorrent password | |
| 115 | |
| 116 | #### Infrastructure |
| 117 | |
| 118 | | Variable | Required | Description | |
| 119 | |---|---|---| |
| 120 | | `UNRAID_SERVER1_NAME` | yes | Display name for first Unraid server | |
| 121 | | `UNRAID_SERVER1_URL` | yes | Unraid GraphQL endpoint (skill) | |
| 122 | | `UNRAID_SERVER1_API_KEY` | yes | Unraid API key (skill) | |
| 123 | | `UNRAID_SERVER2_NAME` | no | Display name for second Unraid server | |
| 124 | | `UNRAID_SERVER2_URL` | no | Second Unraid GraphQL endpoint | |
| 125 | | `UNRAID_SERVER2_API_KEY` | no | Second Unraid API key | |
| 126 | | `UNIFI_URL` | yes | UniFi controller URL (skill) | |
| 127 | | `UNIFI_USERNAME` | yes | UniFi username | |
| 128 | | `UNIFI_PASSWORD` | yes | UniFi password | |
| 129 | | `UNIFI_SITE` | no | UniFi site name (default: `default`) | |
| 130 | | `TAILSCALE_API_KEY` | yes | Tailscale API key | |
| 131 | | `TAILSCALE_TAILNET` | yes | Tailscale tailnet name or `-` | |
| 132 | | `ZFS_HOST` | yes | Host where ZFS commands run | |
| 133 | | `SWAG_HOST` | yes | SWAG reverse proxy host | |
| 134 | | `SWAG_CONTAINER_NAME` | no | SWAG container name (default: `swag`) | |
| 135 | | `SWAG_APPDATA_PATH` | no | SWAG appdata path | |
| 136 | | `SWAG_COMPOSE_PATH` | no | SWAG compose file path | |
| 137 | |
| 138 | #### Utilities and Document Management |
| 139 | |
| 140 | | Variable | Required | Description | |
| 141 | |---|---|---| |
| 142 | | `LINKDING_URL` | yes | Linkding bookmark manager URL | |
| 143 | | `LINKDING_API_KEY` | yes | Linkding API token | |
| 144 | | `MEMOS_URL` | yes | Memos server URL | |
| 145 | | `M |