Service-provider bundles
Ship a single JSON file that pre-configures EasyCC for your clients on first launch.
A bundle is a single JSON file (bootstrap.json) that pre-configures EasyCC on first launch — provider config, pre-seeded agents and skills, MCP servers, branding, and managed policy. No setup wizard, no manual API-key pasting, no user training.
For deeper content, see Pre-seeding for agents/skills/MCP/secrets, and Lifecycle for the bundle builder, idempotent re-apply, testing, and the full schema.
Who uses bundles:
- MSPs deploying EasyCC across many client tenants.
- AI consulting firms baking their methodology into a turnkey install.
- Resellers shipping pre-configured EasyCC under their own brand.
- Internal IT teams pre-configuring for non-technical users.
A bundle isn't a license file, isn't encrypted, isn't signed in v1 (v2 will add signing), and isn't the same as managed policy — though a bundle can contain policy as one of its sections.
What's in a bundle
Every section is optional. A minimal bundle might set only the provider; a full one configures everything.
| Section | What it does |
|---|---|
branding | Title-bar org name, welcome-screen message, support URL/email |
policy | Managed-policy fields (same shape as Configuration) |
provider | Which Claude provider — Anthropic, gateway, Bedrock, Vertex, Foundry — plus the secret_ref for the API key |
agents[] | Pre-seeded agents with starting CLAUDE.md, skills, MCP servers, and starter files |
userSkills[] | Skills installed at user scope (visible in every agent) |
userMcpServers[] | MCP servers installed at user scope |
onboarding | Skip the setup wizard, pick first-launch view, declare required fields |
On first launch EasyCC discovers the bundle, validates it against the schema, applies each section in order, writes an idempotency marker, and shows the user the configured workspace.
Minimum viable bundle
The smallest useful bundle: an org name, a provider, one agent, and skip the setup wizard.
{
"schemaVersion": 1,
"bundleId": "acme-easycc-v1",
"branding": {
"orgName": "Acme",
"welcomeMessage": "Welcome to Acme Intelligence. Your agents are already configured for Acme projects.",
"supportEmail": "it@acme.example"
},
"provider": {
"type": "anthropic",
"apiKeySecretRef": "keychain:com.easycc.app/auth_claude_api_key"
},
"agents": [
{
"id": "acme-marketing",
"displayName": "Marketing",
"pinned": true,
"skills": [
{ "name": "summarize", "source": "bundled" }
]
}
],
"onboarding": {
"skipSageOnboarding": true
}
}To ship it:
- Push the API key to the keychain at the slot referenced in
apiKeySecretRef— see Secrets. - Drop
bootstrap.jsonin a discovery location (below). - Install EasyCC with
--silent-first-runafter the bundle is in place.
The result: the user opens EasyCC, sees "Welcome to Acme Intelligence", finds a pinned Marketing agent with /summarize installed, and can immediately chat with Claude. No keys to paste; no choices to make.
Where to put the bundle
EasyCC checks five paths on every launch, in priority order. First match wins.
| # | Path | Notes |
|---|---|---|
| 1 | The path in the bundle_path managed-policy field | Anywhere on disk |
| 2 | %PROGRAMDATA%\EasyCC\bootstrap.json (Windows) or /Library/Application Support/EasyCC/bootstrap.json (macOS) | Recommended default — the platform sidecar |
| 3 | The URL in the bundle_url managed-policy field | v2 feature; stub in v1 |
| 4 | <config_dir>/EasyCC/bootstrap.json | Per-user fallback. Useful for testing without admin rights. |
| 5 | <install-dir>/bootstrap.json | Next-to-binary. Useful for service-provider repackaging. |
File permissions: Everyone: Read on Windows; chmod 644 on macOS.
If EasyCC starts as vanilla, the bundle wasn't found. If sections fail to apply, check the EasyCC log (search for [bundle]) and the marker file at <config_dir>/EasyCC/bundle-applied.json.
Branding fields
Text-only in v1. No logo, no theme overrides.
| Field | Used in | Notes |
|---|---|---|
orgName | Title bar tag, help links | Short — under 30 chars works best |
welcomeMessage | First-launch welcome screen | 120 chars max. "Welcome to Acme Intelligence. Your agents are already configured for Acme projects." |
supportUrl | Help menu → "Support" | Opens in the user's browser |
supportEmail | Help menu fallback | Opens a mailto: link |
Skip marketing taglines and fake urgency — the welcome screen is the first thing a non-technical user sees, and tone matters. Empty fields don't blank existing values when a bundle is re-applied; only non-empty fields overwrite.
A v2 release will add an SVG sanitizer for branded logos. Until then, the org name + welcome message carries most of the brand signal.
Where to go next
How is this guide?