Skip to main content
This page covers all commands related to Mibyan profiles. For general CLI commands, see CLI Commands Reference.

mibyan profile

Top-level command for managing profiles. Running mibyan profile without a subcommand shows help.

mibyan profile list

Lists all profiles. The currently active profile is marked with *. Example:
No options.

mibyan profile use

Sets <name> as the active profile. All subsequent mibyan commands (without -p) will use this profile. Example:

mibyan profile create

Creates a new profile. Creating a profile does not make that profile directory the default project/workspace directory for terminal commands. If you want a profile to start in a specific project, set terminal.cwd in that profile’s config.yaml. Examples:

mibyan profile describe

Read or set a profile’s description. The description is consumed by the kanban orchestrator to route tasks based on what each profile is good at, rather than guessing from the profile name alone. Persisted in <profile_dir>/profile.yaml so it survives reboots and is shared with the gateway. With no flags, prints the current description (or (no description set for '<name>') if empty). Examples:

mibyan profile delete

Deletes a profile and removes its shell alias. Example:
This permanently deletes the profile’s entire directory including all config, memories, sessions, and skills. The default profile (~/.mibyan) cannot be deleted — use mibyan uninstall to remove everything.

mibyan profile show

Displays details about a profile including its home directory, configured model, gateway status, skills count, and configuration file status. The skills count here (and in mibyan profile list) is counted on the spot. The Desktop and dashboard profile lists are polled every few seconds, so they show the last known count instead and refresh it in the background — a freshly started backend may briefly show 0 skills for a profile until the first background count lands, and a skill you just installed appears in those lists within about a minute. This shows the profile’s Mibyan home directory, not the terminal working directory. Terminal commands start from terminal.cwd (or the launch directory on the local backend when cwd: "."). Example:

mibyan profile alias

Regenerates the shell alias script at ~/.local/bin/<name>. Useful if the alias was accidentally deleted or if you need to update it after moving your Mibyan installation. Example:

mibyan profile rename

Renames a profile. Updates the directory and shell alias. A gateway service installed under the old name (mibyan -p <old-name> gateway install) is removed, whether or not the gateway is running, because it would start the old name at the next login; reinstall it with mibyan -p <new-name> gateway install. Inside the Docker image the s6 gateway slot moves to the new name. Example:
The rename also migrates the profile’s persisted session/routing identity — session keys (agent:<old>:*), sessions.profile_name, heartbeats, and routing/delivery rows — to the new name. A live multiplexed gateway owns that migration (it holds the routing index in memory), so when it is running the CLI delegates to it. Checkpoint (/rollback) history of workspaces that live inside the profile directory is rekeyed to their new path as well, so it stays reachable after the rename; mibyan profile migrate-identity retries that step too if it was reported as failed.

mibyan profile migrate-identity

Retries the identity migration of a rename that already completed. Run it if mibyan profile rename warned that the live gateway could not migrate session identity: restart the gateway (it reloads the routing index from the database, so the migration lands), or stop it — with no gateway holding the store the command performs the durable rewrite itself. The migration is driven by the rows that still name <old>, so profiles/<old> does not have to exist; only <new> is checked. Idempotent — re-running a completed migration succeeds with nothing left to rekey. Exits non-zero when a live gateway refuses the migration, when a database rejects the rewrite (a routing collision, a lock, or one of the two databases failing while the other succeeds), naming the database and error. Example:

mibyan profile purge-identity

Retries the identity purge of a delete that already completed. Run it if mibyan profile delete reported that its session/routing identity settlement is still pending: restart the gateway (it reloads the routing index from the database, so the purge lands), or stop it — with no gateway holding the store the command performs the durable delete itself. The purge keys off <name> alone, so the profile directory does not have to exist — but a profile that is live again under that name is refused: identity is settled by name, so purging it would take the new profile’s routing with it. Routing keys (agent:<name>:*), heartbeat rows and the profile’s Telegram topic bindings/mode rows are deleted; delivery_obligations rows are marked abandoned rather than dropped, so pending delivery state is not lost silently. Session rows are not deleted by the purge itself — it settles identity, not history; whether a conversation record outlives a delete is decided by mibyan profile delete, which removes the profile’s own profiles/<name>/, its state.db included. Idempotent — re-running a completed purge succeeds with nothing left to purge. Exits non-zero when the name is a live profile again, when a live gateway refuses the purge, or when a database rejects the delete (a lock, or a partial failure). Example:

mibyan profile export

Exports a profile as a compressed tar.gz archive — a portable snapshot you can back up, move to another machine, or hand to someone else. auth.json and .env are always excluded. Also available in chat as /export, and in the desktop app via ⌘K → Export profile… or a profile square’s right-click menu. A desktop export additionally stages desktop.json (skin, light/dark mode, custom themes, rail color, window layout) into the archive. Example:
See Export and import a profile file for exactly what lands in the archive and what to check before sending one to someone else.

mibyan profile import

Imports a profile from a tar.gz archive, as a new profile. Refuses to overwrite an existing profile, and cannot import as default (the built-in root profile) — pass --name in either case. A shell wrapper is created when the name doesn’t collide with an existing command. Also available in chat as /import, and in the desktop app via ⌘K → Import profile… or the import button beside the profile rail’s +. A desktop import also applies any bundled desktop.json overlay (theme, layout) and switches you into the new profile. Example:

Distribution commands

New to distributions? Start with the Profile Distributions user guide — it covers the why, when, and how with full examples. The sections below are a dry CLI reference for when you know what you want.
Distributions turn a profile into a shareable, versioned artifact published as a git repository. A recipient installs the distribution with a single command and can update it in place later without touching their local memories, sessions, or credentials. auth.json and .env are never part of a distribution — they stay on the installing user’s machine. The recipient’s user data (memories, sessions, auth, their own edits to .env) is always preserved across the initial install and subsequent updates.
Two ways to share a profile, and they complement each other. mibyan profile export / import (also /export and /import in chat) produce a single file — no repo, no manifest, and a desktop export carries your theme and layout too. Distribution (install / update / info) publishes a profile as a git repo so recipients can pull versioned updates later. Backup and restore is the export file’s other job. See Two ways to share a profile.

mibyan profile install

Installs a profile distribution from a git URL or a local directory. The installer shows the manifest, lists required env vars, and warns about cron jobs before asking for confirmation. Required env vars go into a .env.EXAMPLE file you copy to .env and fill in. Examples:

mibyan profile update

Re-clones the distribution from its recorded source and applies updates. Distribution-owned files (SOUL.md, mcp.json) are overwritten and the skills and cron jobs the distribution ships are replaced; skills or cron jobs you added under skills/ or cron/ yourself stay in place. User data (memories, sessions, auth, .env) is never touched. A symlinked skills/, cron/ or skill category directory is refused before anything is written — replace the link with a real directory and re-run. config.yaml is preserved by default to keep your local overrides. Pass --force-config to reset it to the distribution’s shipped config.

mibyan profile info

Prints the profile’s distribution manifest — name, version, required Mibyan version, author, env var requirements, the source URL/path, and the Installed: timestamp recorded when the distribution was last install-ed or update-d. Useful for checking what a shared profile needs before installing it, and for spotting “this profile was installed 6 months ago and hasn’t been updated.” mibyan profile list also shows the distribution name and version in a Distribution column, and mibyan profile show <name> / delete <name> surface the source URL so you can tell at a glance which profiles came from a git repo vs. were created locally.

Private distributions

A private git repository works as a distribution source with no extra configuration — the install shells out to your normal git binary, so whatever authentication your shell is already set up for (SSH key, git credential helper, GitHub CLI’s stored HTTPS credentials) applies transparently.
If a clone prompts for credentials interactively in your terminal during install, that prompt flows through. Set up your auth the way you’d normally use git clone against the same repo first, then install.

Distribution manifest (distribution.yaml)

Every distribution has a distribution.yaml at the root of its repository:
mibyan_requires supports >=, <=, ==, !=, >, <, or a bare version (treated as >=). Install fails with a clear error if the current Mibyan version doesn’t satisfy the spec. distribution_owned is optional. If set, only those paths are updated; anything else in the profile stays user-owned. A directory of skills, such as skills/ or a category like skills/research/, is merged per skill: the skills the distribution ships are replaced, and skills you added there stay. A skill the author later drops from the distribution is left in place on update, as with top-level skills/. If omitted, the defaults above apply.

Publishing a distribution

Authoring a distribution is just a git push:
  1. In your profile directory, create distribution.yaml with at least name and version.
  2. Initialize a git repo (or use an existing one) and push to GitHub / GitLab / any host Mibyan can clone from.
  3. Tell recipients to run mibyan profile install <your-repo-url>.
Use git tags for versioned releases — recipients who clone HEAD get your latest state, and you can always bump version: in the manifest.

mibyan -p / mibyan --profile

Global flag to run any Mibyan command under a specific profile without changing the sticky default. This overrides the active profile for the duration of the command. Examples:

mibyan completion

Generates shell completion scripts. Includes completions for profile names and profile subcommands. Examples:
After installation, tab completion works for:
  • mibyan profile <TAB> — subcommands (list, use, create, etc.)
  • mibyan profile use <TAB> — profile names
  • mibyan -p <TAB> — profile names

See also