EXTENSIBILITY
A solid core. An extensible periphery.
The app owns editorial truth, rendering and every ceiling. Extensions get narrow, versioned seams. You add a registry, install individual items by reference, and approve every one of them yourself.
Four extension kinds · Ed25519-signed registries · No server component · Agent-authorable
THE MODEL
Registries you add. Items you name.
An extension registry is a signed HTTPS index addressed by a namespace. You configure any number of them and install individual items, shadcn style.
@alchemist/corridorkeyREGISTRY NAMESPACE
Added by you from an out-of-band descriptor. Its Ed25519 key is pinned on first use; a later key change is a hard refusal, never a re-prompt.
ITEM SLUG
A versioned, platform-targeted signed archive. Consent is per item, keyed to the SHA-256 of its exact manifest bytes.
What we borrow from shadcn
The addressing and configuration model: namespaced registries added by the user, @ns/item references, cross-registry dependencies resolved topologically, and selective install of exactly the items you name.
What we deliberately do not
The payload model. shadcn copies source files into your project; this is a compiled Zig binary. Source installation and embedded scripting are out of scope, and only native codec libraries may execute inside the editor.
FOUR KINDS
Narrow seams, one per job.
App plugins, browse providers and OFX packs execute out of process. Signed codec libraries are the one explicit in-process exception.
ofx_packINFORMATIONAL
OpenFX effect packs
An OpenFX plug-in bundle, plus an optional runtime directory for models and inference engines.
HOW IT RUNS
Hosted by the AlchemistOfxHost helper process. OpenFX 1.5.1, Filter context, RGBA byte and float, render scale, temporal access. Every discovered Filter appears in the Compositing node picker.
browse_providerENFORCED
Media Browser sources
A source for the Media Browser — a Frame.io-style integration, or a bridge to your asset manager.
HOW IT RUNS
Your executable, spawned as a contained child with an environment allowlist and no inherited secrets, speaking bounded JSON-RPC on stdio. Requests cap at 64 KiB, responses at 256 KiB, calls at five seconds.
app_pluginENFORCED AT THE HOST BOUNDARY
Event hooks and menu actions
Bounded event subscriptions and context-menu contributions on clips, bin media and tracks.
HOW IT RUNS
The same contained transport. events.receive and menu.invoke are gated by declared contributions and capabilities — a disabled or unconsented extension receives neither.
codec_pluginINFORMATIONAL · SIGNED-ONLY
Native decoders
A native video or audio decoder. C ABI 1 for video, ABI 2 for audio, video or both.
HOW IT RUNS
Loaded inside the editor after explicit pre-load consent, with decoder- and frame-owned library lifetime. Signed registries only — never from @local, even during development.
SCOPE
What this is not.
Stated as plainly as the rest, because the absences are decisions rather than gaps, and you should be able to plan around them.
No marketplace
No discovery ranking, no ratings, no payments. You add a registry you already trust and install the item you already wanted.
No project-shipped extensions
A project package may reference @ns/slug but can never carry the code, and a reference never triggers an install.
No silent updates
Nothing auto-updates unless your build shipped the key that signs it. Unverified and local items move only when you move them.