Architecture
Request path
Section titled “Request path”Click is a static browser application. It does not proxy arbitrary plugin traffic and does not manage Podman. Host is the only lifecycle authority; Click, formless-pluginctl, REST clients, and MCP agents submit the same revisioned commands.
Security boundaries
Section titled “Security boundaries”- Canvas is sandboxed browser content. It receives a narrow
clickAPI and capability results, not Host tokens. - daScript executes inside Click’s compiled runtime with budgeted callbacks and styled UI primitives.
- ABI v2 widgets are hash-approved Emscripten side modules. They share Click’s WASM address space and are trusted, not sandboxed.
- Host plugins are immutable OCI workloads mediated by
runsc, withnetwork=noneand a generation-private HPP/2 Unix socket. - External network access exists only after an exact
net.connect(host,port)grant. TLS remains end-to-end between the plugin and service.
Lifecycle
Section titled “Lifecycle”Host reconciles desired state rather than exposing container operations. Installation verifies an exact image digest and publisher policy, then stores the plugin disabled. Enablement requires permission approval. On-demand plugins run only while a panel, dependency, or administrative pin demands them.
Every generation owns its socket, egress bridge, secret leases, subscriptions, and effects. Closing the scope tears those resources down and records any failure while continuing remaining disposers.
Why capabilities
Section titled “Why capabilities”A capability such as dev.formless.binance-market names a provider contract and allowed operations. It is narrower than access to fetch, arbitrary REST, or a Host relay accepting URLs. This keeps policy reviewable, permits provider replacement, and produces meaningful traces for human and AI debugging.