Skip to main content
A profile distribution packages a complete Mibyan agent — personality, skills, cron jobs, MCP connections, config — as a git repository. Anyone with access to the repo can install the whole agent with one command, update it in place, and keep their own memories, sessions, and API keys untouched. If a profile is a local agent, a distribution is that agent made shareable.

Two ways to share a profile

Mibyan has two sharing paths, and they answer different questions. Distributions are the durable one; export files are the quick one. Pick a distribution when the agent is a product you’ll keep improving and other people should track: a team’s reviewed internal agent, a community release, the same agent deployed to five machines. Pick an export file when you just want someone to have your setup right now, or you’re moving to a new laptop. No repo, no manifest — run /export in chat, hand over the file, they run /import. See Export and import a profile file. The two aren’t exclusive. Plenty of authors dogfood a profile, /export it to a colleague for a second opinion, then publish it as a distribution once it’s worth versioning.

What this means

Before distributions, sharing a Mibyan agent meant sending someone:
  1. Your SOUL.md
  2. A list of skills to install
  3. Your config.yaml, minus the secrets
  4. A description of which MCP servers you wired up
  5. Any cron jobs you scheduled
  6. Instructions for which env vars to set
…and hoping they assembled it correctly. Every version bump or bug fix meant repeating the handoff. With distributions, all of that lives in one git repo:
Recipients run:
…and they now have the whole agent. They fill in their own API keys (.env.EXAMPLE → .env), and they can run my-research-agent chat or address it through Telegram / Discord / Slack / any gateway platform. When you push a new version, they run mibyan profile update my-research-agent and pull your changes — their memories and sessions stay put.

Why git?

We considered tarballs, HTTP archives, a custom format. None of them beat git:
  • Zero build step for authors. Push to GitHub; consumers install. There’s no “pack this, upload that, update the index” loop.
  • Tags, branches, and commits are already the versioning system. A tag push does for us what “pack + upload a release” does for other tools.
  • Updates are a fetch. Not a re-download of the whole archive.
  • Transparent. Users can browse the repo, read diffs between versions, open issues against it, fork it to customize.
  • Private repos work for free. SSH keys, git credential helpers, GitHub CLI stored credentials — whatever auth your terminal is already set up for applies transparently.
  • Reproducibility is a commit SHA. The same thing pip and npm record.
The tradeoff: recipients need git installed. On any machine running Mibyan in 2026, that’s already true.

When should you use a distribution?

Good fits:
  • You’re sharing a specialized agent — a compliance monitor, a code reviewer, a research assistant, a customer-support bot — with a team or with the community.
  • You’re deploying the same agent to multiple machines and don’t want to copy files manually each time.
  • You’re iterating on an agent and want recipients to pick up new versions with one command.
  • You’re building an agent as a product — opinionated defaults, curated skills, tuned prompts — that other people should use as a starting point.
Not a fit:
  • You want to hand someone your setup once, right now. A distribution needs a repo, a manifest, and a .gitignore. /export needs none of that — see Export and import a profile file. Same for backing up or moving a profile to a new machine.
  • You want to share your desktop theme and layout. A distribution carries the agent — SOUL, config, skills, cron, MCP, plugins. An export made from the desktop app also carries the look: skin, light/dark mode, custom themes, rail color, and window layout.
  • You want to share API keys alongside the agent. auth.json and .env are deliberately excluded from distributions. Each installer brings their own credentials. (Export files strip them too.)
  • You want to share memories / sessions / conversation history. Those are user data, not distribution content. Never shipped. (Export files are different here — read what an export contains before sending one.)
Mibyan does not control git. The file exclusions described on this page are applied by the installer when someone runs mibyan profile install or mibyan profile update. They are not applied when you run git add or git commit.

The lifecycle: author to installer to update

Below is the full end-to-end flow. Pick the side you care about.

For authors: publishing a distribution

Step 1 — Start from a working profile

Build and refine the agent like any other profile:

Step 2 — Add a distribution.yaml

Create ~/.mibyan/profiles/research-bot/distribution.yaml:
That’s the whole manifest. Every field except name has a sensible default.

Step 3 — Create a .gitignore before the first commit

Do this before running git init or git add. If you have already chatted with the profile, run setup, or otherwise used it, the directory now contains files you must not ship: .env, auth.json, memories/, sessions/, state.db*, logs/, and more.
Create ~/.mibyan/profiles/research-bot/.gitignore with at minimum:
This mirrors the hard-excluded paths that the installer strips on its end. Anything else you want to keep out of the repo (scratch files, large assets, local-only skills) should also go in here. For cron, commit only cron/jobs.json. Mibyan treats every other entry under cron/ as runtime state (locks, ledgers, output, suggestions, and future scheduler sidecars) and never installs or replaces it from a distribution. Root-level hidden entries under skills/ are likewise local Mibyan bookkeeping; hidden files inside an authored skill directory remain part of that skill.

Step 4 — Push to a git repo

The repo is now a distribution. Anyone with access can install it.
The installer will additionally strip the hard-excluded paths even if an author somehow ships them — but that only protects installers, not the author.

Step 5 — Tag versioned releases

Every time the agent reaches a stable point, bump the version and tag:
Recipients who run mibyan profile update research-bot will pull the latest.

What the repo looks like

A complete authored distribution:

Distribution-owned vs user-owned

When an installer updates to a new version, some things get replaced (author’s domain) and some things stay put (installer’s domain). Defaults: You can override the distribution-owned list in the manifest:
When omitted, the defaults above apply — which is what most distributions want.

For installers: using a distribution

Install

What happens:
  1. Clones the repo into a temporary directory.
  2. Reads distribution.yaml, shows you the manifest (name, version, description, author, required env vars).
  3. Checks each required env var against your shell environment and the target profile’s existing .env. Marks each as ✓ set or needs setting so you know exactly what to configure.
  4. Asks for confirmation. Pass -y / --yes to skip.
  5. Copies distribution-owned files into ~/.mibyan/profiles/research-bot/ (or wherever the manifest’s name resolves). The hard-excluded paths are stripped during this copy, even if the author accidentally left them in the repo.
  6. Writes .env.EXAMPLE with the required keys commented out — copy to .env and fill in.
  7. With --alias, creates a wrapper so you can run research-bot chat directly.

Source types

Any git URL works:

Override the profile name

Two users wanting the same distribution under different profile names:

Fill in env vars

After install, the agent’s profile contains a .env.EXAMPLE:
Copy it:
Required keys that were already in your shell environment (e.g. OPENAI_API_KEY exported in your ~/.zshrc) are marked ✓ set during install — you don’t need to duplicate them in .env.

Check what you installed

Shows:
mibyan profile list also shows a Distribution column so at a glance you can see which of your profiles came from repos and which you hand-built:

Update

What happens:
  1. Re-clones the repo from the recorded source URL.
  2. Replaces distribution-owned files (SOUL, mcp.json) and shipped skills, then merges cron/jobs.json by job id. Your own jobs stay, shipped job definitions refresh without changing your paused/enabled choice, and newly shipped jobs arrive paused.
  3. Preserves your config.yaml — you may have tuned the model, temperature, or other settings. Pass --force-config to overwrite.
  4. Never touches user data: memories, sessions, auth, .env, logs, state.
No re-downloading the whole archive. No stomping your local changes to config. No deleting your conversation history.

Remove

The delete prompt surfaces distribution info before asking you to confirm:
So you never accidentally delete an agent without knowing where it came from or being able to re-install it.

Use cases and patterns

Personal: sync one agent across machines

You built a research assistant on your laptop. You want the same agent on your workstation.
Any iteration on the laptop (git commit && push) pulls onto the workstation with mibyan profile update research-bot. Memories stay per-machine — the laptop remembers its own conversations, the workstation remembers its own, they don’t collide.

Team: ship a reviewed internal agent

Your engineering team wants a shared PR-review bot with a specific SOUL, specific skills, and a cron that runs every PR through it.
When the lead ships v1.1 (better SOUL, new skill), engineers run mibyan profile update pr-reviewer and everyone’s on the new version within minutes.

Community: publish a public agent

You built something novel — maybe a “Polymarket trader” or an “academic paper summarizer” or a “Minecraft server ops assistant.” You want to share it.
Tweet the install command. People who try it send you issues and PRs. If someone wants to customize, they fork — same git workflow everyone already knows.

Product: ship an opinionated agent

You built Mibyan-on-top — maybe a compliance-monitoring harness, a customer-support stack, a domain-specific research platform. You want to distribute it as a product.
Your customers install via a single command; the install preview tells them exactly which keys to have ready; updates roll out the moment you tag a new release; their compliance data (memories/, sessions/) never leaves their machine.

Ephemeral: one-off scripts on shared infra

You’re the ops lead. You want a temporary agent that diagnoses a production incident — a canned SOUL with the right tools and MCP connections — and runs on three on-call engineers’ laptops for the next week.
The install-delete cycle is cheap enough to be disposable.

Recipes

Pin to a specific version

Git ref pinning (#v1.2.0) is planned but not in the initial release — install currently tracks the default branch. Track your installed version via mibyan profile info <name> and hold off on updates until you’re ready.

Check what version you’re on vs. latest

Keep local config customizations through updates

The default update behavior already does this: config.yaml is preserved. To be safe, write your local tweaks to a file the distribution doesn’t own:
…and reference it from config.yaml or your SOUL as needed.

Force a clean re-install

Fork and customize

The standard git workflow — distributions are just repos:

Test a distribution before pushing

From the author’s machine:

Export and import a profile file

When you don’t need versioning, skip the repo. /export packs a profile into a single .tar.gz; /import unpacks it as a new profile on the other end. Credentials are stripped on the way out.

Export

In the CLI, TUI, or desktop chat:
Without -o, the CLI and TUI place the archive in Mibyan’s managed profile-exports/ directory under the default Mibyan home, not in the current working directory. This keeps routine exports out of source checkouts and prevents a generated profile snapshot from being mistaken for a repository source file. If the Mibyan home itself lives inside a Git checkout (some Docker/custom deployments), the archive goes to ~/.mibyan-profile-exports/ or, failing that, a per-user directory under the OS temp dir — never into the checkout. If no safe automatic location exists at all (every candidate is inside a Git checkout), the export refuses with “No safe automatic export destination” and you must pass -o with a path outside the checkout. An explicit -o path is still honored when you intentionally choose where to save the archive. Or from a shell, same machinery:
In the desktop app there are three doors, all landing on a native save dialog:
  • ⌘K → Export profile…
  • Right-click a profile square in the sidebar rail → Export profile…
  • The import button beside the rail’s + covers the other direction
A desktop export adds one extra file the CLI doesn’t: desktop.json, carrying your skin, light/dark mode, any custom theme definitions the skin needs, the profile’s rail color, and your window layout. That’s why a profile shared from the desktop arrives looking like yours, not just behaving like yours.

Import

The profile name is inferred from the archive unless you pass --name. Importing over an existing profile is refused — rename or delete the old one first. A shell wrapper (research-bot → mibyan -p research-bot) is created when the name doesn’t collide with an existing command. Importing in the desktop app also applies the desktop.json overlay and drops you into the new profile on a fresh chat. Importing a desktop-made archive from the CLI is fine — the overlay file rides along on disk and applies the next time you open that profile in the desktop.
You cannot import as default — that name is the built-in root profile (~/.mibyan). Pass --name something-else.

What an export file contains

Always excluded, both profiles types: auth.json and .env. Your API keys never leave the machine. The default profile (~/.mibyan) is exported through an allow-list — only known Mibyan artifacts, so an unrelated file sitting in your home directory can’t get swept in: config.yaml, SOUL.md, MEMORY.md, USER.md, todo.json, system_prompt.md, AGENTS.md, CLAUDE.md, .cursorrules, skills/, plugins/, cron/, scripts/, sessions/, memories/, knowledge/, preferences/, and desktop.json when the desktop staged one. A named profile (~/.mibyan/profiles/<name>) copies the whole directory minus auth.json / .env. That’s broader — if the profile has state.db, logs, or caches, they go in the archive too, and the file gets big.
Read your archive before you send itAn export is a snapshot of your profile, not a curated release. Unlike a distribution, it can include memories/, sessions/, and USER.md — and nothing scans skills, memories, or your persona for anything personal you wrote into them. Credentials are filtered by filename; content is not.Before sharing with someone else, list what’s inside:
If it carries conversation history you’d rather not hand over, publish a distribution instead — those never ship memories or sessions.

What’s NOT in a distribution (ever)

The installer hard-excludes these paths even if an author accidentally ships them. No config option lets you override this — the safety guard is a regression-tested invariant:
  • auth.json — OAuth tokens, platform credentials
  • .env — API keys, secrets
  • memories/ — conversation memory
  • sessions/ — conversation history
  • state.db, state.db-shm, state.db-wal — session metadata
  • logs/ — agent and error logs
  • workspace/ — generated working files
  • plans/ — scratch plans
  • home/ — user’s home mount in Docker backends
  • *_cache/ — image / audio / document caches
  • local/ — user-reserved customization namespace
When you clone a distribution as an installer, these simply aren’t copied into your profile directory. When you update, your copies stay put. If you installed the same distribution on five machines, you have five isolated sets of this data — one per machine.
This exclusion runs at install / update time on the installer’s machine. It does not prevent an author from commiting sensitive/unnecessary files. Authors must use a .gitignore to keep secrets out of the repo.

Security and trust

Profile distributions are unsigned by default. You’re trusting:
  • The git host (GitHub / GitLab / wherever) to serve the bytes the author pushed.
  • The author to not ship a malicious SOUL, skills, or cron jobs.
Cron jobs from a distribution are not auto-scheduled — newly shipped jobs are installed paused. Review them with mibyan -p <name> cron list and resume only the jobs you trust. SOUL.md and skills ARE active as soon as you start chatting with the profile, so read them before your first run if you’re installing from someone you don’t know. Rough analogy: installing a distribution is like installing a browser extension or a VS Code extension. Low friction, high power, trust the source. For internal company distributions, use a private repo and your normal git auth — nothing new to configure. Future versions may add signing, a lockfile (.distribution-lock.yaml) with a resolved commit SHA, and a --dry-run flag that prints the diff before applying an update. None of those are shipping yet.

Under the hood

For implementation details, precise CLI behavior, and all flags, see the Profile Commands reference. The short version:
  • install, update, info live inside mibyan profile — not a parallel command tree.
  • The manifest format is YAML with a tiny required schema (name only).
  • The installer uses your local git binary for cloning, so any auth your shell already handles (SSH keys, credential helpers) works transparently.
  • After clone, .git/ is stripped — the installed profile isn’t itself a git checkout, avoiding “oh my, I accidentally committed my .env to the distribution’s git history” traps.
  • Reserved profile names (mibyan, test, tmp, root, sudo) are rejected at install time to avoid collisions with common binaries.

See also