Skip to main content


cc-profiles

A local web UI to manage multiple Claude Code profiles on one machine.

License: GPL-3.0-or-later cc-profiles on PyPI No dependencies Buy me a coffee

Python 3.9+ HTML5 CSS JavaScript Claude Code pytest macOS Linux


cc-profiles in use: a project is moved from the Default profile to Work with one click, then its memories, a conversation, the skills, an MCP server, the comparison of two profiles and the backup of the move are shown

Quick Start • Features • Screenshots • How It Works • Usage • Documentation • Configuration • Troubleshooting • License

cc-profiles keeps your Claude Code profiles in order: work and personal accounts side by side, each with its own memory, conversations, skills, MCP servers and settings. Move projects and memories between profiles, relink projects whose folder moved, share skills and plugins, and edit settings with safe dropdowns, all from a page in your browser. Every change is backed up first, so anything you do can be undone with one click.


Quick Start

Install with a single command:

curl -fsSL https://raw.githubusercontent.com/andreaiannarone/cc-profiles/main/install.sh | sh

The script installs cc-profiles with pipx or uv, whichever you have, and adds a /cc-profiles command to Claude Code in every profile. It never uses sudo and writes only in your home folder; read it first if you like. Run it again to update. To install the app without touching your profiles:

curl -fsSL https://raw.githubusercontent.com/andreaiannarone/cc-profiles/main/install.sh | sh -s -- --no-command

Then open it, from a terminal or from inside Claude Code:

cc-profiles          # starts on http://127.0.0.1:4777 and opens your browser
/cc-profiles         # inside any Claude Code session: opens the app and the session goes on
/cc-profiles restart # restarts it, e.g. after an update (/cc-profiles stop stops it)

On the first run, cc-profiles finds ~/.claude and every ~/.claude-<name> folder that looks like a profile. Rename them from the Profiles tab.

Other ways to install

By hand, with pipx or uv:

pipx install cc-profiles        # or: uv tool install cc-profiles
cc-profiles                     # the first start adds /cc-profiles to Claude Code

With Homebrew:

brew install andreaiannarone/cc-profiles/cc-profiles

Try it without installing anything:

uvx cc-profiles

From the Claude Code plugin marketplace. The command is then /cc-profiles:open, because Claude Code prefixes plugin commands with the plugin's name. The plugin only opens the app, so install cc-profiles first:

/plugin marketplace add andreaiannarone/cc-profiles
/plugin install cc-profiles@cc-profiles

From source:

git clone https://github.com/andreaiannarone/cc-profiles.git
cd cc-profiles
python3 -m pip install -e .
cc-profiles

Unofficial. cc-profiles is a community project, not affiliated with or endorsed by Anthropic. It works with Claude Code's on-disk files, whose format is undocumented and may change between releases. That is why every operation it performs creates a backup you can restore with one click.

Key Features

  • 🗂️ Projects: see which profile each project belongs to and what it holds in each one. Move a project to another profile with its conversations, memories, file snapshots, prompt history and per-project settings, after a preview of every file it touches. Relink a project whose folder you moved or renamed. Assign projects with simple path rules.
  • 🧠 Memories: browse, edit, move and delete the memories of every project, with the MEMORY.md indexes kept in sync.
  • 💬 Conversations: read the conversations of every project, and move a single one to another profile, with its file snapshots, or delete it.
  • 📊 Usage: tokens per day, per project, per model and per profile, with an estimated cost at list price (subscription plans are not billed per token), read from the conversations Claude Code saves.
  • 👤 Profiles: see the account each profile is signed in with. Create a profile, empty, copied from another one or from a template you saved (settings, permissions, skills, MCP servers; never conversations or credentials); rename it, change its command, or delete it, optionally merging its content into another profile first, after a preview of everything it touches.
  • 🧩 Skills: browse, create, edit, copy and delete the skills of each profile, or copy one to every profile at once.
  • 🔌 MCP servers: add, edit, copy (to one profile or to all) and remove MCP servers, for every project or for one. Tokens in environment variables and headers stay out of the list.
  • 🧳 Export and import: move a profile to another computer as a .zip, with or without conversations. Login credentials never travel.
  • 🧷 Plugins: see the plugins installed in each profile, their version and marketplace, and turn them on or off.
  • 📁 Profile by folder: type claude in a work folder and it starts in your Work profile. One switch in the Profiles tab adds one marked line to your ~/.zshrc (backed up, undoable); the folder rules you already use for projects decide the profile, and a CLAUDE_CONFIG_DIR you set yourself still wins.
  • 🔗 Sharing: share skills, plugins, agents, commands, CLAUDE.md or settings.json with the source profile through symlinks. Install once, use everywhere. The confirmation previews what the link replaces.
  • ⚙️ Settings: every setting of Claude Code's /config panel, in groups, plus the commit and pull request attribution switches. Dropdowns offer only the values Claude Code accepts and show which file each value comes from. Apply a value or a permission rule to every profile in one undoable step. Edit CLAUDE.md, permissions and the raw JSON, with validation.
  • 📟 Status line: build Claude Code's status line without writing a script. Tick what to show (profile, model, path, git branch, context used, tokens, session cost, 5-hour and weekly limits and more), drag it into order, pick brackets, separator and colors or start from a preset, and check the live preview; one click puts it in every profile. A small sh + jq script, never your own one overwritten. How it works
  • ⏪ Backups: every operation is journaled. Restore undoes it, and a restore can itself be undone. Old ones are deleted automatically after 90 days (or 15, 30, 60), except those you mark Keep.
  • 🩺 Health: login status, config validity, broken links, memory indexes, and projects whose folder disappeared, with candidate folders to relink them to.
  • 🔍 Search everything: one field searches projects, memories, skills, MCP servers and CLAUDE.md in every profile, and opens what you pick.
  • ⚖️ Compare two profiles: settings, permissions, skills, MCP servers, CLAUDE.md and plugins side by side, with one-click copies of what differs.
  • 🧭 Fast to get around: keyboard shortcuts (/ to search, g then a letter to open a tab, ? for the list), and quick even on homes with thousands of projects.
  • ⌨️ Inside Claude Code: /cc-profiles opens the app from any session, /cc-profiles restart restarts it after an update; cc-profiles label shows the active profile in your status line.
  • 🌓 Light and dark: the theme button in the header picks System, Light or Dark; System follows your operating system.
  • 🔒 Local and private: listens on 127.0.0.1 only, with a token on every request. Nothing is sent anywhere unless you click to check for updates or to install Claude Code.
  • 🔄 Updates from the app: cc-profiles checks PyPI once a day (or when you click Check for updates in the (i) panel) and shows a dot when a new version is out; one click updates and restarts it (pipx, uv or Homebrew), then it shows what's new. Report a problem… opens a bug report with the versions filled in.

Screenshots

The Memories tab: projects on the left, the memories of the selected project with their descriptions, and an editor

Memories: every project's memories, with an editor

The Conversations tab: the projects of a profile, the conversations of the selected one, and a read-only viewer of its messages

Conversations: read, move or delete a single conversation

The Usage tab: total tokens, estimated cost, replies and cache share, then a bar chart of tokens per day over the last 30 days

Usage: tokens and estimated cost per day, project and model

The status line editor: pieces to tick and reorder, each with its brackets, a separator, colors and a live preview of the line

Status line: build it by ticking boxes, with a live preview

The Skills tab: a grid of skill cards with their descriptions, and the SKILL.md of the selected skill

Skills: browse, create, edit and copy skills

The MCP tab: the MCP servers of a profile with their type, command or URL, and where they are available

MCP: servers for every project or for one

The Compare tab: the settings of two profiles side by side, with the differences highlighted and buttons to copy them

Compare: two profiles side by side, one-click copies

The Settings tab: the settings of Claude Code's /config panel in groups, the file each value comes from, and the values of the other profiles

Settings: everything in /config, applied to one profile or all

The screenshots show sample data from the /sandbox skill. GitHub shows them in your theme, light or dark.


Why

Claude Code reads its configuration from ~/.claude, or from whatever directory CLAUDE_CONFIG_DIR points to. Each directory is a separate profile with its own memory, conversations, prompt history, settings and login:

claude                                     # default profile (~/.claude)
CLAUDE_CONFIG_DIR=~/.claude-work claude    # a second profile

That is great for keeping contexts apart, but maintaining profiles by hand is painful:

  • Conversations live in folders named like -Users-you-code-client--api, one per project path.
  • The prompt history is one JSONL file to filter line by line.
  • The default profile's settings live in ~/.claude.json, outside ~/.claude.
  • When you move a project folder, Claude Code silently loses its history.

cc-profiles does all of this for you, from a page in your browser.


How It Works

Core components:

  1. Local server: a small Python package, standard library only, one module per area. It listens on 127.0.0.1, checks the Host header against DNS rebinding and a random token against requests from other websites.
  2. Single-page UI: one HTML file with inline CSS and vanilla JavaScript, no build step and nothing loaded from the internet. Light and dark themes, or the system's.
  3. Backups with a journal: before any change, the files it touches are copied to ~/.cc-profiles/backups/<date>_<operation>/, and every step (copy, move, new folder, new link) is written to a manifest.json. Restore replays the journal backwards.
  4. Atomic writes: every file is written to a temporary file in the same folder and then renamed, so a running Claude Code never reads a half-written file. Writes follow symlinks, so shared files stay shared.
  5. Path recovery: Claude Code's project folder names cannot be turned back into paths. cc-profiles rebuilds them from config files, prompt history and the cwd of conversations, and walks the disk when nothing mentions them.
  6. Launchers and commands: new profiles get a small claude-<id> script in ~/.local/bin; the app adds /cc-profiles to Claude Code the first time it starts and keeps it up to date. Files cc-profiles creates carry a mark, and it never overwrites a file without it.

See Architecture and Claude Code's on-disk formats for details.


Usage

cc-profiles                   # starts on http://127.0.0.1:4777 and opens the browser; ctrl+C stops it
cc-profiles --port 4800       # another port
cc-profiles --no-browser      # just the server
cc-profiles open              # starts it in the background if needed, opens the browser and returns
cc-profiles restart           # stops it and starts it again, e.g. after an update (cc-profiles stop only stops it)
cc-profiles install-command   # adds /cc-profiles again (the app does it by itself); --off: never add it
cc-profiles label             # prints the name of the active profile, for status lines

Open it from Claude Code

Type /cc-profiles in any Claude Code session: the app starts in the background, your browser opens on it, and the session goes on. /cc-profiles restart and /cc-profiles stop restart or stop the app. The command is a small file, commands/cc-profiles.md: cc-profiles writes it in every profile the first time it starts, rewrites it after an update, and adds it to the profiles you create from the app. A copy you delete stays deleted. Profiles that share commands with the source profile get it through the link.

Commands for each profile

When cc-profiles creates a profile, it adds a launcher to ~/.local/bin. For a profile called work that is claude-work:

#!/bin/sh
CLAUDE_CONFIG_DIR="$HOME/.claude-work" exec claude "$@"

The script works in every shell. Make sure ~/.local/bin is in your PATH; the official Claude Code installer usually adds it.

Show the profile in your status line

cc-profiles label prints the name of the profile in use, based on CLAUDE_CONFIG_DIR. Call it from your Claude Code status line script:

profile=$(cc-profiles label 2>/dev/null)
printf '(%s) ' "$profile"

Rules

The Projects tab assigns each project to a profile using rules: "a path containing this text belongs to that profile". Create them from the UI with Assign…. They are checked in order, the first match wins and new rules go first:

{ "match": "code/work", "profile": "work" }

"profile": "shared" marks paths that may appear in every profile, like your home folder.


Documentation

📚 Full documentation at cc-profiles.andreaia.com

Getting Started

  • Why cc-profiles: what it adds to CLAUDE_CONFIG_DIR and shell aliases
  • Getting started: install, first run, launcher commands, /cc-profiles
  • Concepts: profiles, the source profile, projects, rules, sharing, backups
  • FAQ: several accounts, a profile per project, credentials, safety, undo

How-to

Guides by Tab

Reference

For Contributors


Configuration

cc-profiles keeps its own data in ~/.cc-profiles/, never in the repository:

Path Content
~/.cc-profiles/config.json profiles, rules, folders to search when relinking
~/.cc-profiles/backups/ one folder per operation: a manifest.json journal plus the original files
~/.cc-profiles/server.log output of the server started by cc-profiles open
~/.local/bin/claude-<id> launchers created for new profiles
<profile>/commands/cc-profiles.md the /cc-profiles command, if you added it
Environment variable Effect
CC_PROFILES_PORT default port instead of 4777
CC_PROFILES_HOME data folder instead of ~/.cc-profiles
CC_PROFILES_QUIET if set, do not log HTTP requests to the terminal

See the Configuration reference for config.json and every option.


System Requirements

  • macOS or Linux; on Windows, inside WSL 2
  • Python 3.9 or later: macOS's built-in Python works
  • pipx, uv or Homebrew to install it
  • Claude Code, or let cc-profiles install it for you with the official installer

No dependencies: cc-profiles uses only the Python standard library.


Security

  • The server listens on 127.0.0.1 only and accepts only Host: 127.0.0.1:<port> or localhost:<port>, which blocks DNS rebinding.
  • Every API call needs a random token, generated at each start and embedded in the page, so other websites cannot control the app.
  • Writes are atomic (temporary file, then rename), so Claude Code never reads a half-written file, even while it is running.
  • Names of projects, memories, skills and backups are validated against path traversal.
  • Login credentials are never copied between profiles: each profile signs in on its own. Copying an MCP server copies its configuration, never its sign-in.
  • cc-profiles reaches the internet only to ask pypi.org for its latest version, once a day (PyPI sees your IP address; turn it off in the (i) panel to check only when you click), and when you click Install to run the official Claude Code installer.

See SECURITY.md to report a vulnerability.


Limitations

  • Claude Code's file formats are not a public API. Settings dropdowns were checked against Claude Code 2.1.289; the About panel shows which version you have.
  • "Session open" means a claude process is running in the profile (read from the process list on macOS and from /proc on Linux), or a conversation was written in the last 2 minutes.
  • Claude Code keeps .claude.json in memory while it runs: restart open sessions after changing their MCP servers.
  • Deleting a profile does not remove credentials that Claude Code may have stored in the macOS Keychain for it.

Troubleshooting

Problem Fix
"Port 4777 is busy with another program" start cc-profiles with --port 4778 (if cc-profiles itself is running, cc-profiles just opens it in the browser)
A tab says the page is newer than the server you updated cc-profiles while it was running: run cc-profiles restart (or /cc-profiles restart in Claude Code), then reload the page
cc-profiles: command not found run pipx ensurepath (or uv tool update-shell) and open a new terminal
/cc-profiles does not appear in Claude Code start cc-profiles once, then restart the session; if it is still missing, run cc-profiles install-command
/cc-profiles says the command was not found cc-profiles was moved or reinstalled another way: start cc-profiles once and it points the command to the new place
A project shows "folder not found on disk" click Relink… and pick the folder where it lives now
A setting has no effect the Settings tab shows which file the value comes from: settings.local.json wins over settings.json

See the Troubleshooting guide for more.


Contributing

Contributions are welcome! Please:

  1. Fork the repository and create a branch
  2. Make your changes with tests: every operation that writes must go through Backup and have a test that restores it
  3. Keep it standard library only and compatible with Python 3.9
  4. Update the documentation and CHANGELOG.md
  5. Open a pull request

See CONTRIBUTING.md to run the app and the tests locally. If you use Claude Code, the repository's .claude/ folder keeps you on a sandbox and has skills for the common chores. Good first contributions: translations (the UI is English only), Windows support, a "dry run" preview for big operations.


License

cc-profiles is licensed under the GNU General Public License v3.0 or later. © Andrea Iannarone

You can use, study, change and share it freely. If you distribute it, modified or not, you must do so under the same license and with the source code. Version 0.1.0 was released under MIT and stays available under it.


Support


Built with Claude Code | Made for Claude Code | Pure Python standard library

© 2026 Andrea Iannarone

Metadata

Release files for cc-profiles 0.5.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cc-profiles 0.5.2
File Size Uploaded
cc_profiles-0.5.2.tar.gz 237.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for cc-profiles 0.5.2
File Interpreter ABI Platform
cc_profiles-0.5.2-py3-none-any.whl Python 3 none any Details

Total release size: 419.9 kB

Release files / cc_profiles-0.5.2.tar.gz

Download URL cc_profiles-0.5.2.tar.gz
Size 237.7 kB
Tags Source
SHA-256 checksum
How to use checksums
3eb326554be3de0043b1df94d4831044557dc2dddd19ae657b916212778e076c
BLAKE2b-256 checksum
How to use checksums
89a72d5f7b9ad778c485874a7c43f13d06bf651d07f1b111b91fd6c0f5e800ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / cc_profiles-0.5.2-py3-none-any.whl

Download URL cc_profiles-0.5.2-py3-none-any.whl
Size 182.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
88d28cc1118d1affea2e968f818c31152c9a5edbdf4ccc04e3d60e50b01c7ada
BLAKE2b-256 checksum
How to use checksums
b53e901012d94c14b449e8b0ca17492abed17aa2b9a6d52828a661795f50587e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.7

2 release files

0.5.6

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

This release

0.5.2 This release

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.9

2 release files

0.4.8

2 release files

0.4.7

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page