Extensions
Declarative data extensions the AI builds from a schema, and sandboxed custom mini-apps that run in a locked-down iframe with no network by default.
Extensions add structured tools to your canvas. There are two kinds: declarative extensions that Spectacle renders from a schema, and sandboxed custom mini-apps that run their own code inside a locked-down frame. Both are managed from Settings → Extensions.
Declarative extensions
A declarative extension is described by a schema, not by code. You ask for one in the chat beside your canvas, and the model writes the schema; Spectacle renders it with the components the app already ships.
- Tables with typed fields. Define columns and constraints (required fields, minimums and maximums, enumerations). Rows are stored on the canvas like any other element.
- Views. Render a table as
grid,cards,form, orkanban. A single table can have several views on different parts of the canvas. - Rollups. Aggregate across rows — sums, counts, averages — computed from the data, with no general evaluation.
- Inline references. Link rows to notes, sections, and other canvases, and pull values across references.
- AI actions. Declare an action (for example, "summarise this row" or "draft a reply") that the AI runs on demand and returns as a proposal you review.
Because a declarative extension is only a schema, there is no code the model wrote running on your machine: there is nothing to sandbox or escape. Every schema is validated against the extension format before it reaches a canvas, and every change arrives as a proposal card with Apply, Edit, and Discard.
Sandboxed custom mini-apps
When an extension needs real code — a bespoke calculator, a custom visualisation — it runs as a mini-app inside a sandboxed frame, isolated from your data and the network:
- Locked-down iframe. The mini-app loads in
<iframe sandbox="allow-scripts">with a null origin, so it cannot reach Spectacle's storage, your files, or other extensions. - No network by default. The frame's content security policy sets
connect-src 'none'. A mini-app can only make network requests to hosts it declares in an explicitpermissions.networkallowlist, and only after you approve them. - Automatic network blocking on Sensitive canvases. On a canvas marked
Sensitive, network access is blocked outright regardless of the allowlist, so a mini-app on sensitive work can never send its contents anywhere. - Proposals, not silent writes. A mini-app writes to the canvas through the same proposal path as everything else: you review changes before they land.
Keeping and sharing extensions
- Durable. An extension stays on the canvas and keeps its values between sessions.
- Editable. Ask for a change ("add a region selector") and the model edits the schema; the extension re-renders from it, and you review the change like any other.
- Shareable. Export an extension as a portable file. Anyone can drop it onto their own canvas, where it is validated before it is added.