Enforced contracts
Manifest fields, capabilities, and SDK calls are tied back to the validators and runtime gates that enforce them.
Production guidance for secure, host-independent plugins—from manifest to realtime UI.
UnCorded is a self-hosted collaboration platform where every feature is a plugin—chat, voice, dashboards, game integrations, and embedded applications. Central provides identity, discovery, entitlements, and marketplace metadata; each server runtime owns its content and executes its plugins.
A packaged Windows server normally runs through native hosting in an app-owned WSL2 distro. Docker remains a supported fallback and migration path. The plugin contract is identical on both hosts, so production plugins must not depend on container paths, Docker DNS aliases, or a particular process manager.
manifest.json) — declares identity, entry points, UI contributions, and the exact capabilities the runtime may grant. Undeclared capability means a typed, fail-closed rejection.createPlugin() over stdio JSON IPC. It owns private SQLite/KV/files, request handlers, events, schedules, notifications, and host-brokered integrations.createPluginFrontend(). It calls handlers, receives realtime updates, uploads files, follows the active theme, and asks the shell to render native surfaces.manifest.json ── declares ──▶ runtime-enforced capabilities
│
├── backend/ ── createPlugin() ──▶ sandboxed process ⇄ runtime (stdio IPC)
│ SQLite · events · broadcast · net
│
└── frontend/ ── createPluginFrontend() ──▶ sandboxed iframe ⇄ shell
request · files · surfaces| Axis | Choices | What it changes for a plugin |
|---|---|---|
| Runtime host | Native WSL2 (default) or Docker fallback | Nothing in the SDK contract. Avoid host-specific paths and DNS assumptions. |
| Reachability | Local-only, UnCorded Transport, or owner tunnel | Public hostnames, raw public ports, and off-device access may or may not exist. |
| Visibility | Private or public | Directory and membership policy; it does not create a network path. |
Read Platform & hosting model before building a proxy, network, companion, or homelab integration.
| You want to… | Read |
|---|---|
| Build a complete plugin | Getting started |
| Understand hosting and Transport | Platform & hosting model |
| Ship something maintainable | Production plugin checklist |
| Look up a manifest field or capability | Manifest · Permissions |
| Look up an SDK method | Backend SDK · Frontend SDK |
| Proxy a self-hosted app | Reverse-proxy plugins |
| Copy a small, complete implementation | Noteboard golden example |
| Study a shipped data-owning plugin | text-channels walkthrough |
| Prime an AI coding session | Agent guide & source map |
This site publishes the llms.txt convention:
Inside the monorepo, start with root AGENTS.md, then docs/site/ai/agent-guide.md. Those files point to the validator, public type exports, runtime capability gates, hosting implementation, and production examples. Historical plans are context, not current behavior.
Documentation is part of the SDK contract. CI checks generated manifest content, public SDK coverage, capability coverage, plugin manifests, stale host-specific guidance, and the VitePress build.