The self-hosting plan
The maintainer, 2026-11-08: "install the hosting plugin by default" · "Hosting should also be in the selfhosting tier" · "let's create our own tier for selfhosting" · and, on its scope, "Only the listed packages" — Pro stays a separate purchase.
Until this plan existed, a Mac that registered with the registry landed on Free. Hosting is the app a Mac's first instance needs (the heartbeat, the local instances, the fleet monitor) and it is filed enterprise, so the registry refused it, and the first fleet Mac had its plan raised to Enterprise by hand (2026-11-07). This plan removes that, through the declared plan model and nothing else: no grant, no code path that skips the gate.
What it is
| Wire id | selfhosting (PlanTiers.SelfHosting) — label Self-hosting |
| Rank | 5: above Free (0), below Personal (10) — by rank it covers the free baseline only |
| Members | the packages it includes by name beside its rank (below) |
| Price | free (monthlyPrice: 0), no annual price, not contact-sales |
| Bought online | no — PlanTiers.IsSelfServe stays Personal and Pro only |
| Model spend | unmetered: local models (Ollama, Apple Intelligence) or the owner's own keys |
| Seeded | Admin/Tiers/selfhosting with rank, members, created by the Store's tier seeding; members is a RULE field, so a live node that disagrees with the seed is brought back in line |
| Shown | on the Plans page as a card without a button, saying how it is obtained |
The members
| Package | Tier | Why a self-hoster needs it |
|---|---|---|
| Hosting | enterprise | deployment records, local instances, the heartbeat, the fleet monitor |
| ClaudeCode | pro | the Claude Code harness — agent rounds on the machine's own CLI |
| Acp | pro | the Agent Client Protocol harness |
| Analysis | pro | the analysis tools agents call |
| WebSearch | pro | web search for agents |
| Voice | pro | speech in and out |
| Teams | personal | Microsoft Teams chats and messages |
| Indexing, Approvals, Observability | pro | the non-free onboarding defaults: ingestion, approvals, the instance's own observability |
| iMessage, WhatsApp | personal | the non-free Mac defaults: the Mac's own messages |
The free onboarding defaults (Essentials and its closure, AI, Chat, OpenAI, MyAi, Mail, Publish, OgCard, Export, Notifications, Mcp, Hosting.Instance, the view packs, Providers, Apple Intelligence, Google) and Hosting's requirements (Store, AI, Essentials, Feedback) are free or untiered, so the rank covers them. Not covered: every other Personal or Pro package — Codex, Copilot, Cursor, Grok, OpenCode, Antigravity, Signature, Expenses, Video, DataModelling, BusinessRules, AzureCostManagement, Chess, the games … — and the enterprise vertical. Those stay a purchase.
The rule — one declaration, two readers
A plan covers a package when the package's tier ranks at or below the plan's, when the plan is all-access (Dedicated), or when the package is one of the plan's declared members. A member is covered by its plan whatever its tier; it widens no other plan.
- The declaration is
PlanTiers.SelfHostingMembers(Store/Licensing). The Store reads it throughPlanTiers.IsMember(SubscriptionFact.Covers(tier, packageId, now),PlanAccess.InstanceCovers/ShapeOfwith the package id — the gating, the Get button, the unlock, the catalog card). The plan's seed writes the same list ontoAdmin/Tiers/selfhostingascontent.members. - The registry (core
PlanTierRanks.Members, read byPlanTierLadderoff the tier node, decided byCoversInstance(plan, tier, packageId)inPluginGrant.Allows) decides what an instance on the plan may pull from that node — the same list, never a second copy. - A caller that passes no package id decides by rank alone, so nothing that was refused before is opened by accident; every surface that knows the package passes its id.
How an installation gets it
- New installations.
memex-localregisters OPEN (no key) unless the operator passes one. The registry answers an open registration with its configured open registration key (PluginCatalog:OpenRegistration:Key), and the instance enrols into that key's plan, which isselfhosting. An open registration is by construction a self-hosted install presenting itself. - Already registered installations are moved by a registry global administrator with
InstancePlanService.SetPlan(Admin ▸ Instance grants on the registry). - Then the instance's catalogue pass installs what
PluginCatalog:InstallByDefaultnames —Plugins/Hostingon a Mac — and the setup wizard's ticked defaults, with nothing refused.
Open decision
- A licence document. Every sold plan has one under
Store/Licences; this plan has none yet, so its card shows no licence link. The text is a legal decision.
Tests
Store/Tier→ Tests: Self-hosting covers its listed members only — a non-member Pro package is not covered; ranked plans unchanged (members by tier, non-members Pro/Personal/Enterprise, rank-only callers, a lapsed plan, the other plans unchanged, the seed carries the declared list as a rule field).Store/Licensing→ Tests: a self-hosting instance opens its listed members only (the gating shape).- Core
MeshWeaver.Hosting.Test→PlanMemberListTest: member covered, non-member Pro package NOT covered, the ranked plans unchanged, the grant decides by id, and the ladder readsmembersoff the tier node.