installs.me
< cd ~/blog

·4 min read#explainer#personas

Claude Code Plugins vs Custom GPTs: Portability Is the Whole Point

A Custom GPT is a lease. A Claude Code plugin is a deed. Both let you package a persona, a set of instructions and knowledge that makes an AI behave like a specific person, but only one of them produces an artifact you can hold in your hands, diff, fork, and take with you when the platform changes its mind.

That difference sounds philosophical until you remember that OpenAI already killed a distribution format once. ChatGPT Plugins launched in March 2023, got a store, got an ecosystem, and were deprecated a year later in favor of GPTs. Everyone who built for that format rebuilt from scratch. The persona you configure in a web form lives exactly as long as the form does.

What each thing actually is

A Custom GPT is a row in OpenAI's database. Its instructions live in a text box capped at 8,000 characters. Its knowledge is a set of files you uploaded into their retrieval store, opaque after upload: you can't see how they're chunked, you can't grep them, you can't diff version 3 against version 2 because there is no version 2, there's only the current state of the form. Distribution happens through the GPT Store, which means through a link that resolves only for logged-in ChatGPT users, on whatever terms the store sets this quarter.

A Claude Code plugin is a directory in a git repository. Concretely:

my-persona/
├── .claude-plugin/
│   └── plugin.json
├── skills/
│   ├── voice/
│   │   ├── SKILL.md
│   │   └── references/
│   └── decisions/
│       └── SKILL.md
└── commands/

Each skill is a SKILL.md with YAML frontmatter (name, description) plus an optional references/ directory of supporting documents. Claude loads a skill on demand when the description matches what the user is doing, so a persona can carry far more context than any instruction box: the voice skill loads when you're ghostwriting, the investing-criteria skill loads when you're evaluating a deal, and neither burns context the rest of the time.

Distribution is a marketplace.json served from any URL you control, with one hard constraint worth knowing: plugin sources referenced over a URL must be git-backed (the git-subdir source type). Point at a plain HTTP directory of files and the install fails silently. This is verified behavior on Claude Code CLI 2.1.x, and it's a constraint that quietly enforces the whole thesis: your plugin must live in a git repo, which means it must be a real, versioned, portable artifact.

The ownership test

Run both formats through three questions.

Can you read the whole thing? GPT: partially. You can read your own instruction box; the knowledge files are upload-and-pray. Plugin: yes, it's text files. cat skills/voice/SKILL.md shows you exactly what the model sees.

Can you version it? GPT: no. There's no history, no rollback, no "what changed between last month's persona and this one." Plugin: it's git. You get diffs, tags, branches, pull requests from collaborators, git blame on your own personality.

Can you move it? GPT: no export exists. Your persona is trapped in the exact shape of one vendor's product. Plugin: the repo is the persona. The SKILL.md format is Markdown with frontmatter, about the most durable file format that exists. If Claude Code changed tomorrow, migrating means writing a converter script over plain text files, not reverse-engineering a database you can't see.

Custom GPTClaude Code plugin
Source of truthVendor databaseGit repo you own
Instructions8k-char text boxUnlimited SKILL.md files, loaded on demand
HistoryNoneFull git history
DistributionGPT Store linkAny URL serving marketplace.json
Exit costTotal rewritegit clone

Why this matters more for personas than for tools

A tool plugin (a linter, a deploy helper) is replaceable. If the platform kills it, you're annoyed for an afternoon. A persona is accumulated judgment: hundreds of hours of writing samples, decision frameworks, the specific way someone evaluates a founder or structures a cold email. That's not something you re-upload from memory. It's the single asset in this whole stack that appreciates over time, which makes it exactly the wrong thing to store in someone else's database.

The install experience doesn't suffer for the ownership, either. Two commands:

/plugin marketplace add <url>
/plugin install <name>@<marketplace>

That's the entire onboarding. No account on a third-party store, no approval queue, no revenue-share terms to accept. The person installing your persona is pulling files from a git source you control, into a tool they already run.

The platform-risk asymmetry

Here's the uncomfortable part for GPT builders: platform risk in a walled garden is total and one-directional. When the GPT Store changed its monetization plans, builders adjusted. When discoverability algorithms shifted, traffic evaporated. None of those builders could respond by taking their asset elsewhere, because there was no asset, only a configuration.

Plugin builders face platform risk too. Anthropic could change the plugin spec, and skills as a format will evolve. But the failure mode is different in kind: a spec change against files you own is a migration; a policy change against a database you don't is an eviction. Migrations are annoying. Evictions are terminal.

If you're going to compress a person into software, and that's genuinely what a good persona is, put it somewhere with property rights. Files, git, a URL you control. Everything else is renting shelf space.

Install a person

installs.me turns your files, calendar and calls into a Claude Code plugin that thinks like you. Anyone installs it with two commands:

/plugin marketplace add https://installs.me/lautaro
/plugin install lautaro@lautaro-installs