Plugin size limits

Artifact and index limits

Look up bundle, tool listing, startup, hub and index bounds.

For: tenant administrators and plugin authors.

Look up bundle, tool listing, startup, hub and index bounds.

The bundle

A plugin is packed into one bundle, the same format the edge builds from a Git commit, and every server reads it in memory to check it.

LimitValuelintpackhub submitinstallWhat it says, for example
Packed size67,108,864 bytes (64 MiB) packed, gzippednot checkederrorerrorerrorthe plugin packs to 70 MB, more than the limit of 64 MB
Unpacked size536,870,912 bytes (512 MiB) unpackednot checkederrorerrorerrorthe bundle unpacks to more than 512 MB
Entries50,000 files and folders in a bundlenot checkederrorerrorerrorthe bundle has more than 50000 entries
Files a check reads4,194,304 bytes (4 MiB) a file, 67,108,864 bytes (64 MiB) of them togethernot checkederrorerrorerroragents/big.yaml: is 5.2 MB; a file the manifest names may have at most 4 MB, and the plugin's checks did not read it
files.count100,000 files and folders in the plugin's folder, outside .git, .venv, node_modules, __pycache__, .oz0-tools, dist, .pytest_cache and .ruff_cacheerrorerrorerrorerrorthe plugin's folder holds more than 100000 files and folders (outside .git, .venv, …)

A file over 4 MiB, or past 64 MiB of read files, is packed and installed but not read by the checks, which never read code. A file the manifest names (an agent, a schema, instructions, a skill, a flow, an eval) must be read, so one that large is an error. Packing leaves out version control, virtual environments, build output, caches, .env files and whatever .gitignore ignores.

The measured listing

LimitValuelintpackhub submitinstallWhat it says, for example
tools.listing.json4,194,304 bytes (4 MiB)errorerrorerrorerrortools.listing.json: is 5000000 bytes, more than the limit of 4194304

The measured listing is what plugin test writes: each function your servers list, with its schemas. A listing that large usually means a server lists far more functions than one plugin should hold; split the plugin.

Tool-size and start-up budgets

Two budgets in estimated tokens keep what every model request carries small (the size budget, the start-up budget). A budget is yours to raise in the plugin's files, where every reviewer sees it, up to 1,000,000.

CodeLimitlintpackhub submitinstallWhat it says, for example
tools.budgetPer agent: its tool definitions, limits.tool_tokens, 8,000 unless set. Per plugin: all its own functions, tool_tokens in oz0-plugin.yaml, 16,000 unless seterrorerrorwarningnot checkedagent clerk: its tool definitions come to about 2,386 tokens in every model request (an estimate), more than its budget of 2,000; the biggest: …
tools.tokensOne function's definition, 1,500warningnot checkednot checkednot checkedfunction office.send_invoice's definition comes to about 1,620 tokens (an estimate; more than 1500)
startup.budgetPer agent: the index of its skills and its tools' manuals in its start-up context, limits.startup_tokens, 4,000 unless seterrorerrorwarningnot checkedagent clerk: the index of its 12 skills comes to about 4,410 tokens in its start-up context (an estimate), more than its budget of 4,000; the biggest: …

At hub submit a budget is a warning: the listing carries the figures, and its page shows them.

The listing

What you write about a plugin when you list it, and what the hub's page and search keep of it. Only hub submit checks these.

LimitValueWhat happens past it
Summary500 charactershub submit refuses it: "--summary is 612 characters, and a listing's summary is at most 500: say in one or two sentences what the plugin does". Without --summary the manifest's description stands in, and must fit too.
A tag1 to 32 lowercase letters, digits and dashes, starting with a letter or a digithub submit refuses it, and so does the listing file's schema.
Tags per listingThe hub's tags.yaml, max_per_listing; 8 when it sets nonehub submit --hub <checkout> refuses more, naming the number and where it comes from; the hub's checks refuse them on the pull request.
Linkshttps:// links of at most 2,048 UTF-8 bytes: a homepage, issues, and a security contact, which may be mailto:hub submit refuses another scheme. The Repository link is computed from the verified source, never written by you.
README excerpt2,000 characters of the README's first sectionCut, never refused. The hub's page shows the whole README; the excerpt is what oz0 hub search, the console's Install dialog and the hub's search cards show.
The graph1,000 parts and 2,000 links between themThe graph of the plugin's parts is cut and says so; nothing is refused.
SBOM in the listing500 package URLsThe listing names the first 500; the SBOM file holds them all.

The hub's review caps

The hub reviews a plugin past its own caps instead of refusing it: a maintainer looks at what makes it that large. They are in the hub's hub.yaml, so another hub may set others.

LimitValueWhat happens past it
Files2,000 files in a pluginA finding on the pull request, which a maintainer reviews
Size25 MiB of files in a pluginA finding on the pull request, which a maintainer reviews
One file5 MiB in one fileA finding on the pull request, which a maintainer reviews

hub submit --check runs the hub's own checks, so it shows these findings before the pull request.

The signed index

LimitValueWhat happens past it
Index size33,554,432 bytes (32 MiB), the signed envelope with its payloadA server refuses an index that large, and keeps the copy it has. index sign writes each version's full listing as a detail document beside the index and signs a compact entry, so tens of thousands of versions fit.

See Run an index of your own.

Copyright © 2026