{"id":45776733,"url":"https://github.com/hwrok/claudep","last_synced_at":"2026-02-26T10:02:45.381Z","repository":{"id":340703117,"uuid":"1152502088","full_name":"hwrok/claudep","owner":"hwrok","description":"Profile manager for Claude Code. Isolates auth/history per profile, shares config (rules, agents, skills) via symlinked templates.","archived":false,"fork":false,"pushed_at":"2026-02-26T04:46:03.000Z","size":24,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-26T08:48:51.042Z","etag":null,"topics":["ai","claude","claude-code","profile-management"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hwrok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2026-02-08T00:55:33.000Z","updated_at":"2026-02-26T04:45:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hwrok/claudep","commit_stats":null,"previous_names":["hwrok/claudep"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/hwrok/claudep","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwrok%2Fclaudep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwrok%2Fclaudep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwrok%2Fclaudep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwrok%2Fclaudep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hwrok","download_url":"https://codeload.github.com/hwrok/claudep/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwrok%2Fclaudep/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29855963,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T08:51:08.701Z","status":"ssl_error","status_checked_at":"2026-02-26T08:50:19.607Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ai","claude","claude-code","profile-management"],"created_at":"2026-02-26T10:02:25.727Z","updated_at":"2026-02-26T10:02:45.371Z","avatar_url":"https://github.com/hwrok.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# claudep 🎭\n\n**Profile manager for [Claude Code](https://docs.anthropic.com/en/docs/claude-code).**\n\n**[Why?](#why)** · **[Quick Start](#quick-start)** · **[How It Works](#how-it-works)** · **[Commands](#commands)** · **[Tips](#tips)** · **[Caveats](#known-caveats)**\n\n## Why?\n\nClaude Code stores everything — auth, history, settings, rules — in a single `~/.claude` directory. Great if you're one person with one life. Less great if you:\n\n- Switch between personal and work accounts\n- Use different [auth methods](https://code.claude.com/docs/en/setup#authentication) (OAuth vs AWS Bedrock vs API key)\n- Want isolated chat histories per context\n- Need different rules/skills/agents per project category\n- Are just generally the kind of person who has opinions about config organization 🫠\n\nclaudep leverages Claude Code's officially supported [`CLAUDE_CONFIG_DIR`](https://code.claude.com/docs/en/settings) env var to point at different config directories per profile. Profiles symlink to shared templates for common config, so you're not copy-pasting CLAUDE.md files around like an animal.\n\n**This is user-level profile swapping.** Claude Code's settings hierarchy (project `settings.local.json` → project `settings.json` → user config) is fully respected — claudep just swaps which user config directory Claude sees.\n\nOther typical `~/.claude` directories like `cache`, `debug`, `plugins`, `todos`, and `history` are auto-created by Claude Code per profile and stay fully isolated — no leakage between profiles. The only things shared are the dirs claudep explicitly manages via symlinks (settings, rules, agents, skills, statusline, CLAUDE.md). This does mean some light redundancy per profile as caches and plugins are downloaded independently. An acceptable tradeoff for now — a more pnpm-style content-addressable symlink approach may come later if it becomes painful. 📦\n\n### How is this different?\n\nClaude Code has no built-in profile management — Anthropic's [official stance](https://github.com/anthropics/claude-code/issues/261) is that `CLAUDE_CONFIG_DIR` is the answer. Fair enough.\n\nThere are a handful of third-party account switchers ([ccs](https://github.com/kaitranntt/ccs), [cc-account-switcher](https://github.com/ming86/cc-account-switcher), [claude-switch](https://github.com/rzkmak/claude-switch), etc.) that swap auth credentials between accounts. They solve the \"which account am I logged into\" problem.\n\nclaudep solves a different problem: **shared config management across profiles.** Rather than duplicating your rules, agents, skills, and instructions into every profile directory, claudep symlinks them from templates. Update a template, every linked profile gets the change. Need one profile to diverge? Eject just that item. The rest keeps inheriting. None of the existing tools do this — they're account switchers, not config managers.\n\nThat said, claudep *is* also an account switcher — each profile has its own isolated auth state, so switching profiles switches accounts. It just gets there as a side effect of managing entire config directories rather than swapping credentials directly. 🤝\n\n## Quick Start\n\n```bash\nchmod +x ./install.sh\n\n# install (creates symlink to /usr/local/bin/claudep) (may require sudo) (run once)\n./install.sh\n\n# initialize (~/.claudep with default template) (run once)\nclaudep init\n\n# create a profile\nclaudep profile add personal\n\n# launch claude with that profile\nclaudep start personal\n```\n\nThat's it. You now have a `personal` profile that symlinks to the default template. Claude Code sees it as its config directory.\n\n## How It Works\n\n```\n~/.claudep/\n  templates/\n    default/              ← shared config (rules, agents, skills, etc.)\n      agents/\n      rules/\n      skills/\n      statusline/\n      CLAUDE.md\n      settings.json\n  profiles/\n    personal/             ← symlinks → templates/default/*\n    work/                 ← symlinks → templates/default/*\n```\n\n- **Templates** hold shared config. Every profile symlinks to a template.\n- **Profiles** are what Claude Code actually runs against (`CLAUDE_CONFIG_DIR` points here).\n- **Eject** breaks individual symlinks into independent copies when a profile needs to diverge.\n\nThink of it as template inheritance, minus the inheritance. One level of symlinks. No magic. ✨\n\n## Commands\n\n### `claudep init`\n\nSets up claudep's directory structure and default template.\n\n```bash\nclaudep init                   # defaults to ~/.claudep\nclaudep init --path ~/my-dir   # custom location\nclaudep init --force           # re-init, overwrite template (no prompt)\n```\n\nRe-running `init` on an existing install prompts you to refresh or fill missing files.\n\n### `claudep start \u003cprofile\u003e [...]`\n\nLaunch Claude Code with the given profile. Any additional args are passed through to `claude`.\n\n```bash\nclaudep start work\nclaudep start work --resume\nclaudep start work -p \"fix the tests\"\n```\n\nAlso available as `claudep profile start \u003cprofile\u003e` if you enjoy typing.\n\n---\n\n### Profile Commands\n\nProfiles represent distinct Claude Code environments — different accounts, auth methods, or project contexts. Each profile is its own `CLAUDE_CONFIG_DIR` with isolated history, auth state, and todos. Shared config (rules, agents, etc.) is symlinked from a template until you eject it.\n\n#### `claudep profile add \u003cname\u003e [--template \u003cname\u003e]`\n\nCreate a new profile. Symlinks to the default template unless `--template` is specified.\n\n```bash\nclaudep profile add personal\nclaudep profile add work --template corp\n```\n\n#### `claudep profile list`\n\nList available profiles.\n\n#### `claudep profile remove \u003cname\u003e`\n\nDelete a profile (with confirmation). Just removes the profile directory — templates are untouched.\n\n#### `claudep profile eject \u003cname\u003e --all | --items \u003clist\u003e`\n\nConvert symlinked items to independent copies. For when a profile needs its own version of something.\n\n```bash\n# eject everything\nclaudep profile eject work --all\n\n# eject specific items\nclaudep profile eject work --items settings,instructions\n```\n\n**Ejectable items:** `agents`, `rules`, `skills`, `statusline`, `instructions` (CLAUDE.md), `settings` (settings.json)\n\nEject resolves from wherever the symlink currently points — not hardcoded to default. So profiles extending custom templates eject correctly. 👍\n\n---\n\n### Template Commands\n\nTemplates are optional if you only need one shared config — `default` is created by `init` and most users never need another. They become useful when you want different base configurations for *categories* of work: a `dev` template with coding-focused agents and strict rules, a `research` template with exploratory skills, a `corp` template with your org's blessed settings. Profiles extend a template, so updating the template propagates to all linked profiles.\n\n#### `claudep template add \u003cname\u003e [--template \u003csource\u003e]`\n\nCreate a new template by copying from an existing one (defaults to `default`).\n\n```bash\nclaudep template add corp\nclaudep template add research --template dev\n```\n\nAfter creation, edit the template's files directly in `~/.claudep/templates/\u003cname\u003e/`.\n\n#### `claudep template list`\n\nList available templates.\n\n#### `claudep template remove \u003cname\u003e`\n\nDelete a template. Refuses to remove `default` (it's not a democracy 🗳️). Also refuses if any profiles are still linked to it — eject or remove them first.\n\n---\n\n### `claudep uninstall`\n\nRemoves the claudep symlink and optionally cleans up all data.\n\n## Installation\n\n**Requirements:** zsh, jq (for statusline only)\n\n```bash\n# clone/download, then:\nchmod +x ./install.sh\n\n./install.sh # may require sudo\n\n# custom install location\n./install.sh /path/to/bin/claudep\n```\n\nThe installer creates a symlink — the actual scripts stay wherever you cloned them.\n\n## Statusline\n\nclaudep includes a statusline script that displays the active profile and context window usage in Claude Code's status bar.\n\n```\n[claudep:personal | ctx: 84/200k | \u003ccurrent-dir\u003e]\n```\n\nThis is configured automatically via the template's `settings.json`. Uses `jq` to parse the context metrics Claude Code pipes to stdin. If you don't have `jq`, the statusline just won't work — everything else is fine.\n\n## Eject Workflow\n\nThe typical lifecycle:\n\n1. `claudep profile add work` — fresh profile, fully symlinked to template\n2. Use it for a while, realize you need different settings for this profile\n3. `claudep profile eject work --items settings` — settings.json is now an independent copy\n4. Edit `~/.claudep/profiles/work/settings.json` directly\n5. Everything else still inherits from the template\n\nYou can eject individual items incrementally. No need to go all-or-nothing unless you want to.\n\n## Tips\n\n### Customization\n\n- **Do:** Edit template files directly in `~/.claudep/templates/\u003cname\u003e/`. Changes propagate to all profiles linked to that template.\n- **Do:** Edit ejected files directly in `~/.claudep/profiles/\u003cname\u003e/`. They're independent copies — no side effects.\n- **Don't:** Edit a profile's symlinked files. The symlink points back to the template, so you're actually editing the template — which silently affects every other profile using it. If you need a profile-specific change, `claudep profile eject` the item first.\n\n### Auth Configurations\n\nOne of the more compelling reasons to use profiles: **per-profile AWS auth without polluting your global shell environment.**\n\nThe [Claude Code docs](https://code.claude.com/docs/en/amazon-bedrock#claude-code-on-amazon-bedrock) suggest exporting `AWS_PROFILE` and friends in your `.zshrc`. This works right up until you accidentally run a Bedrock request against your personal account because you forgot which profile was exported globally. 🙃\n\nWith claudep, each profile's `settings.json` scopes the env vars to that Claude session:\n\n```jsonc\n{\n  // in ~/.claudep/profiles/work-bedrock/settings.json (after eject)\n  \"awsAuthRefresh\": \"aws sso login --profile my-corp-sso\",\n  \"env\": {\n    \"AWS_PROFILE\": \"my-corp-sso\",\n    \"AWS_REGION\": \"us-east-2\",\n    \"CLAUDE_CODE_USE_BEDROCK\": \"1\",\n    \"ANTHROPIC_MODEL\": \"sonnet\",\n    // models may ref arns, us.anthropic, etc -\u003e check with your org for which to use\n    \"ANTHROPIC_DEFAULT_OPUS_MODEL\": \"arn:aws:bedrock:us-east-2:...:application-inference-profile/...\",\n    \"ANTHROPIC_DEFAULT_SONNET_MODEL\": \"arn:aws:bedrock:us-east-2:...:application-inference-profile/...\",\n    \"ANTHROPIC_DEFAULT_HAIKU_MODEL\": \"arn:aws:bedrock:us-east-2:...:application-inference-profile/...\"\n  }\n}\n```\n\n**Workflow:**\n\n1. `claudep profile add work-bedrock`\n2. `claudep profile eject work-bedrock --items settings`\n3. Edit the ejected `settings.json` with your Bedrock/SSO config\n4. `claudep start work-bedrock` — AWS auth is scoped to this session only\n\nYour personal profile keeps using OAuth (or whatever), your work profile uses Bedrock via SSO, and neither knows the other exists. No global env vars. No accidents. No \"why is this billing to the wrong account\" Slack messages at 2am. 🫡\n\n## Known Caveats\n\n- **JetBrains plugin / `/ide` command:** There's a [known Claude Code issue](https://github.com/anthropics/claude-code/issues/4739) where the `/ide` command and JetBrains plugin use hardcoded paths for lock files, which breaks when `CLAUDE_CONFIG_DIR` is set. This is a Claude Code bug, not a claudep bug. **Workaround:** use Claude Code from the IDE's built-in terminal (`claudep start \u003cprofile\u003e`) rather than through the plugin. Works fine — you just don't get the plugin's UI integration.\n- **Empty template directories:** Git doesn't track empty directories, so some directories (`agents/`, `rules/`, etc) in the default template use `.gitkeep` files to persist in the repo. These are automatically removed during initialization.\n- **`keybindings.json` enter key:** There's a [known Claude Code bug](https://github.com/anthropics/claude-code/issues/25087) where `keybindings.json` is ignored for the `enter` key — setting `\"enter\": null` to unbind submit has no effect. Not a `claudep` issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhwrok%2Fclaudep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhwrok%2Fclaudep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhwrok%2Fclaudep/lists"}