Checks
Find problems, pin them to the layer, and offer a fix you can preview.
- Badge crosses the trimprint.bleedMove inside
- Caption is hard to readtext.low-contrastFull opacity
- Hidden layer “Draft logo”export.hidden-layerWaive
Checks, exporters, generators, and panels. Every plugin is signed, sandboxed, and only touches what you allow.
Plugins plug into the same commands, panels, and history you already use.
Find problems, pin them to the layer, and offer a fix you can preview.
Bring files in and write them out. Every byte is hashed as it streams.
sha256:4be1…sha256:09ac…hashing…queuedPatterns, templates, and materials. Same seed, same result.
4812Plugin commands sit in the command bar next to yours.
Before a plugin runs, you see exactly what it asked for. Turn anything off. Anything it didn’t ask for is blocked.
sha256:7b04…e91aPlugins run in a sandbox Varial chooses. Each call has a time, memory, and rate limit. Break them and the call is cut off.
Varial picks the sandbox. The plugin cannot.
generate.halftone38 msgenerate.grid21 mspreview.noise44 msPin a version, or let updates install on their own. If one misbehaves, roll back to the exact build you had.
These are enforced by Varial, not promised by publishers.
A signature proves who made it. It never grants access on its own.
Your approval is tied to the exact package. One changed byte and we ask again.
Plugins never choose their own isolation or limits.
A stale or failed call is dropped before it can touch history.
If an update fails, your working version and its data stay put.
Start with only built-in code if something goes wrong.
Describe it in a manifest, ask for the least you need, and sign it with your key. Varial handles the sandbox, the permissions, and the undo.
{
"schema": "varial.design.extension-manifest.v1",
"id": "com.signalfoundry.contrast-guard",
"name": "Contrast Guard",
"version": "2.3.1",
"publisher": {
"id": "signal-foundry",
"displayName": "Signal Foundry",
"keyId": "sf-2026-01"
},
"compatibility": {
"product": { "minInclusive": "1.0.0", "maxExclusive": "2.0.0" },
"api": { "minInclusive": "1.0.0", "maxExclusive": "2.0.0" },
"documentSchema": { "minInclusive": 1, "maxInclusive": 1 }
},
"entryPoints": [
{ "id": "main", "kind": "worker", "path": "dist/main.js", "sha256": "sha256:9c1e…" }
],
"capabilities": ["design.document.read", "design.document.write", "design.ui.panel"],
"documentAccess": { "readScopes": ["active-document"], "writeScopes": ["selection"] },
"resources": [],
"resourceRequest": { "cpuMsPerCall": 250, "callsPerMinute": 120 },
"package": { "digest": "sha256:7b04…", "files": [] },
"integrity": { "algorithm": "Ed25519", "keyId": "sf-2026-01", "signature": "…" }
}
Flags low-contrast text and fixes it in one click.
Bleed, resolution, and ink checks before it goes to press.
Seeded patterns that come out the same every time.
Every app icon and store screenshot size in one export.
In Preferences, under Extensions. Turn them on or off, check permissions, pin versions, and roll back.
Only if it asks for network access to specific sites and you allow it. Most plugins never ask.
The call is cut off and your file stays as it was. After repeated failures the plugin is turned off.
Yes. Every change goes through normal history, labeled with the plugin that made it.
Yes. Request developer access and we will set you up with signing keys and the manifest format.