ProfileX gives each tool its own isolated config directory per profile, and generates shims like claude-work and codex-personal so you can switch between accounts instantly.
Neither Claude Code nor Codex provides built-in multi-account support. ProfileX solves this by redirecting each tool's native config directory:
- Claude Code →
CLAUDE_CONFIG_DIR - Codex CLI →
CODEX_HOME
Each profile gets its own isolated directory. Auth happens naturally through the tool's normal flow on first run.
curl -fsSL https://raw.githubusercontent.com/derekurban/profilex-cli/main/install.sh | bashFor Windows PowerShell:
irm https://raw.githubusercontent.com/derekurban/profilex-cli/main/install.ps1 | iexnpm i -g profilex-cligo install github.com/derekurban/profilex-cli@latestEnvironment variables:
PROFILEX_INSTALL_DIR(default:~/.local/bin)PROFILEX_VERSION(latestby default, or tag likev0.1.0)PROFILEX_AUTO_PATH(1by default; set0to disable PATH updates)PROFILEX_VERIFY_SIGNATURES(1by default; set0to disable cosign verification)PROFILEX_ALLOW_SOURCE_FALLBACK(0by default; set1to allowgo installfallback)
# Create profiles
profilex add claude personal
profilex add claude work
profilex add codex main
# Set defaults
profilex use claude work
# List profiles with auth status
profilex list
# Use the shims directly
claude-personal
claude-work
codex-mainAfter creating a profile, just run the shim (e.g. claude-work). You'll be prompted to authenticate on first use.
By default, new profiles share session/history storage per tool:
- Claude profiles link
<profile>/projectsto~/.profilex/shared/claude/projects - Codex profiles link
<profile>/sessionsto~/.profilex/shared/codex/sessions
By default, new profiles also share skills across all tools and profiles:
- All profiles link
<profile>/skillsto~/.profilex/shared/skills
Use --isolated with profilex add to keep sessions private, and --no-shared-skills to keep skills private.
profilex add <tool> <profile> [--isolated] [--no-shared-skills]— Create profile + install shimprofilex remove <tool> <profile> [--purge]— Remove profile + shimprofilex uninstall [--purge]— Uninstall profilex binary (and optionally local profilex state)profilex list [--tool claude|codex] [--json]— List profiles with statusprofilex use <tool> <profile>— Set default profileprofilex rename <tool> <old> <new>— Rename a profileprofilex settings <subcommand>- Snapshot/apply tool-native settings presets (auth untouched)profilex tui- Launch interactive terminal UIprofilex shim install [--dir <path>]— Reinstall all shimsprofilex shim uninstall [--all] [<tool> <profile>]— Remove shimsprofilex usage export [--out <file>] [--deep]— Export unified usage bundle for ProfileX-UI
ProfileX can capture tool-native settings from one profile (or native default) and apply them to other profiles while auth remains isolated.
# Capture current settings from source profile into preset "full-access"
profilex settings snapshot codex personal2 full-access
# Apply the preset to another profile
profilex settings apply codex full-access personal1
# Pull from native default Codex config (~/.codex)
profilex settings snapshot codex default baseline
# Apply a preset to native default Claude config (~/.claude or ~/.config/claude)
profilex settings apply claude baseline defaultCurrent settings allowlist:
- Codex:
config.toml - Claude:
settings.json
Supported native aliases: default, native, @default, @native
profilex usage export --out ./public/local-unified-usage.json --deepThis scans ProfileX-managed and stock Claude/Codex usage locations, normalizes events, maps them to profiles (or default-* buckets), and writes a single JSON bundle for ProfileX-UI.
If openclaw is available, it also attempts to ingest openclaw status --json --usage into the unified bundle.
Default root: ~/.profilex (or PROFILEX_HOME override)
~/.profilex/
├── state.json
├── profiles/
│ ├── claude/
│ │ ├── personal/
│ │ └── work/
│ └── codex/
│ └── main/
└── shared/
├── claude/
│ └── projects/
└── codex/
└── sessions/
go test ./...
go vet ./...MIT
