The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.
OpenIDEA’s plugin security rests on three layers. Each is described here together with its limits.
The sandbox and capabilities. Plugin code runs in a WebAssembly sandbox and can only reach files, the network, processes and secrets through capabilities the user approved. This is the main protection, and it applies to every plugin wherever it came from.
Signatures. A publisher signs its packages. The marketplace index says which key belongs to which publisher, so the IDE can tell who published a package and whether it changed.
Review. Official plugins are reviewed as part of the OpenIDEA repository. New community publishers and plugins are reviewed by a registry maintainer before they are listed.
A high-risk capability (process:, fs.read:, fs.write:, ipc:, ide.commands) is equivalent to running
arbitrary code on your machine. The permission dialog says so. Grant one only to a plugin whose publisher you trust.
Code has no file system, environment, network or process access of its own. See Architecture and sandbox.
Each capability has a risk level, and the user approves capabilities when installing. A new version that asks for more stays off until the user allows it. Optional capabilities can be revoked later. See Permissions and capabilities.
An approved program is pinned by path and content hash and checked before every start.
Project plugins (.openidea/plugins) run only in trusted projects and only after approval. In Restricted Mode, plugin code that runs can’t be changed.
A publisher owns a plugin id prefix: publisher acme publishes acme.*. The index lists each publisher’s Ed25519 public keys.
SIGNATURE.json in a package signs the plugin id, version and a digest of all package files.
Installing from a marketplace refuses a package whose signature doesn’t hold: changed after signing, a key that isn’t the publisher’s, another publisher’s id prefix, or a revoked key. It also refuses a download that doesn’t match the digest in the index.
Unsigned packages can still be installed from disk, with a warning in the permission dialog. The dialog also shows whether a package is signed by a publisher the marketplace trusts.
An installed plugin updates silently only to a package signed with the key it was installed with, or with a key that key endorsed (directly or through a chain of endorsed keys). Endorsements by revoked keys don’t count. Another signer (an unendorsed key, or an unsigned package replacing a signed one) is shown in the permission dialog with a warning and needs the user’s confirmation.
A publisher moves to a new key by having the old key endorse it:
In an index you write: openidea-plugin index <dir> --key new.key --previous-key old.key ….
In an index someone else writes, such as the community registry: openidea-plugin endorse "<new public key>" --key old.key --publisher acme prints the endorsement to add.
Older keys stay valid until they are revoked, so packages signed before the rotation keep installing. A lost or stolen key can’t vouch for anything: have it revoked; users then confirm the new key at their next update.
The index can revoke plugin versions (or all versions of a plugin) and publisher keys. The IDE reads the index daily. Revoked plugins, and plugins signed with a revoked key, are disabled with the reason and the user is notified. This also happens after a restart, before their code could run.
Release builds of OpenIDEA carry the official publisher’s public key, built in from the release’s signing key. Plugins named openidea.* must be signed with it, or with a key it endorsed, whatever keys an index lists for openidea. Development builds from source have no built-in key and trust what the index says.
The openidea.* plugins live in plugins/official/. Changes go through the repository’s normal pull request review and CI. CI rebuilds every plugin and fails when a checked-in component is stale (plugins/build.sh --check). The release workflow builds and signs them with the official key.
New publishers and new plugins are reviewed by a maintainer: the source, the capabilities it asks for and why, and that it doesn’t duplicate an existing plugin.
Version updates by an owner need passing checks and a maintainer’s merge. Owners are checked against the publisher file as it was before the pull request.
A plugin must have a public source repository under an open-source licence, and the package must be built from it. Its README must say what it does and why it needs each network, process or other high-risk capability. It must contain no obfuscated or minified code that isn’t built from that source.
On every change, CI checks each package’s SHA-256, runs openidea-plugin check against the latest release, and verifies the signature against the publisher’s keys. A scheduled run repeats this daily.
A plugin that fails the checks against a new OpenIDEA release is reported in an issue and delisted if no fixed version is listed within 30 days.
Maintainers revoke versions or keys for malware, a security problem the owner doesn’t fix, or a lost key. Owners ask for a revocation in an issue.
Review is a human reading of the source and the requested capabilities. It is not a security audit.
CI does not rebuild community packages from source. The rule that a package is built from its public source is checked in review, not by a reproducible build.
The registry’s rules require a maintainer review of the source for new publishers and new plugins. For a version update they require passing checks and a maintainer’s merge; they don’t promise a fresh source review.
Plugins installed from disk, linked folders, project plugins and self-hosted marketplaces get no review from OpenIDEA. The sandbox, the permission dialog and signatures still apply.
A malicious or vulnerable community plugin: open an issue in l0ng-ai/openidea-plugins asking for revocation.
A vulnerability in the plugin host or sandbox itself: see Security.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OpenIDEA","description":"The IDE you know, rebuilt in Rust.","colors":{"primary":"#3871E1","light":"#8FB3FF","dark":"#3871E1"},"logo":{"light":"https://mintcdn.com/openidea/wPxqSmDfBpsYEW4W/logo/light.svg?fit=max\u0026auto=format\u0026n=wPxqSmDfBpsYEW4W\u0026q=85\u0026s=e8b1130beea815a3ea47ad655940657c","dark":"https://mintcdn.com/openidea/wPxqSmDfBpsYEW4W/logo/dark.svg?fit=max\u0026auto=format\u0026n=wPxqSmDfBpsYEW4W\u0026q=85\u0026s=9caa5d6893fe2558669c2070046abee6"},"favicon":"https://mintcdn.com/openidea/wPxqSmDfBpsYEW4W/favicon.svg?fit=max\u0026auto=format\u0026n=wPxqSmDfBpsYEW4W\u0026q=85\u0026s=8805ec0e4503dd288547d13eeb1e59f1","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://github.com/l0ng-ai/openidea","label":"GitHub"}],"primary":{"type":"button","label":"Download","href":"https://github.com/l0ng-ai/openidea/releases/latest"}},"footer":{"socials":{"github":"https://github.com/l0ng-ai/openidea","discord":"https://discord.gg/2Zy4yn7gP"}},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","default":true,"href":"en"},{"language":"zh","href":"zh"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"openidea","hasAudioNarration":false,"actualSubdomain":"openidea","customDomains":["openidea.sh"],"gitSource":{"type":"github","owner":"l0ng-ai","repo":"openidea","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":"","_id":"6af31815b16397a01be8b027"},"entitlements":{},"buildId":"6af31db08e323f6b7c3b3fed","clientVersion":"0.0.4094","searchFilterCounts":[{"language":"en","tag":"Guide","count":41},{"language":"zh","tag":"指南","count":41},{"language":"en","tag":"Plugins","count":25},{"language":"zh","tag":"插件","count":25},{"language":"en","tag":"Languages","count":24},{"language":"en","tag":"Contribute","count":17},{"language":"zh","tag":"参与开发","count":17},{"language":"zh","tag":"语言","count":14},{"language":"en","tag":"Get started","count":11},{"language":"en","tag":"Extension points","count":11},{"language":"zh","tag":"开始","count":11},{"language":"zh","tag":"扩展点","count":11},{"language":"zh","tag":"主要语言","count":10},{"language":"en","tag":"Architecture","count":8},{"language":"en","tag":"Tools","count":8},{"language":"en","tag":"Editing","count":8},{"language":"zh","tag":"架构","count":8},{"language":"zh","tag":"工具","count":8},{"language":"zh","tag":"编辑","count":8},{"language":"en","tag":"Run and debug","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/plugins/publishing/policy","slug":"/en/plugins/publishing/policy","pageMetadata":{"title":"Policy and security","description":"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.","href":"/en/plugins/publishing/policy"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`OpenIDEA’s plugin security rests on three layers. Each is described here together with its limits.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The sandbox and capabilities.`}),` Plugin code runs in a WebAssembly sandbox and can only reach files, the network, processes and secrets through capabilities the user approved. This is the main protection, and it applies to every plugin wherever it came from.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Signatures.`}),` A publisher signs its packages. The marketplace index says which key belongs to which publisher, so the IDE can tell who published a package and whether it changed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Review.`}),` Official plugins are reviewed as part of the OpenIDEA repository. New community publishers and plugins are reviewed by a registry maintainer before they are listed.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`A high-risk capability (`,_jsx(_components.code,{children:`process:`}),`, `,_jsx(_components.code,{children:`fs.read:`}),`, `,_jsx(_components.code,{children:`fs.write:`}),`, `,_jsx(_components.code,{children:`ipc:`}),`, `,_jsx(_components.code,{children:`ide.commands`}),`) is equivalent to running\narbitrary code on your machine. The permission dialog says so. Grant one only to a plugin whose publisher you trust.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`sandbox-and-consent`,children:`Sandbox and consent`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Code has no file system, environment, network or process access of its own. See `,_jsx(_components.a,{href:`/en/plugins/architecture#the-sandbox`,children:`Architecture and sandbox`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Each capability has a risk level, and the user approves capabilities when installing. A new version that asks for more stays off until the user allows it. Optional capabilities can be revoked later. See `,_jsx(_components.a,{href:`/en/plugins/capabilities`,children:`Permissions and capabilities`}),`.`]}),`\n`,_jsx(_components.li,{children:`An approved program is pinned by path and content hash and checked before every start.`}),`\n`,_jsxs(_components.li,{children:[`Project plugins (`,_jsx(_components.code,{children:`.openidea/plugins`}),`) run only in trusted projects and only after approval. In Restricted Mode, plugin code that runs can’t be changed.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`signatures-and-publishers`,children:`Signatures and publishers`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A publisher owns a plugin id prefix: publisher `,_jsx(_components.code,{children:`acme`}),` publishes `,_jsx(_components.code,{children:`acme.*`}),`. The index lists each publisher’s Ed25519 public keys.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`SIGNATURE.json`}),` in a package signs the plugin id, version and a digest of all package files.`]}),`\n`,_jsx(_components.li,{children:`Installing from a marketplace refuses a package whose signature doesn’t hold: changed after signing, a key that isn’t the publisher’s, another publisher’s id prefix, or a revoked key. It also refuses a download that doesn’t match the digest in the index.`}),`\n`,_jsx(_components.li,{children:`Unsigned packages can still be installed from disk, with a warning in the permission dialog. The dialog also shows whether a package is signed by a publisher the marketplace trusts.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`updates-and-signer-changes`,children:`Updates and signer changes`}),`\n`,_jsx(_components.p,{children:`An installed plugin updates silently only to a package signed with the key it was installed with, or with a key that key endorsed (directly or through a chain of endorsed keys). Endorsements by revoked keys don’t count. Another signer (an unendorsed key, or an unsigned package replacing a signed one) is shown in the permission dialog with a warning and needs the user’s confirmation.`}),`\n`,_jsx(Heading,{level:`2`,id:`key-rotation`,children:`Key rotation`}),`\n`,_jsx(_components.p,{children:`A publisher moves to a new key by having the old key endorse it:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`In an index you write: `,_jsx(_components.code,{children:`openidea-plugin index \u003cdir> --key new.key --previous-key old.key …`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`In an index someone else writes, such as the community registry: `,_jsx(_components.code,{children:`openidea-plugin endorse \"\u003cnew public key>\" --key old.key --publisher acme`}),` prints the endorsement to add.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Older keys stay valid until they are revoked, so packages signed before the rotation keep installing. A lost or stolen key can’t vouch for anything: have it revoked; users then confirm the new key at their next update.`}),`\n`,_jsx(Heading,{level:`2`,id:`revocation`,children:`Revocation`}),`\n`,_jsx(_components.p,{children:`The index can revoke plugin versions (or all versions of a plugin) and publisher keys. The IDE reads the index daily. Revoked plugins, and plugins signed with a revoked key, are disabled with the reason and the user is notified. This also happens after a restart, before their code could run.`}),`\n`,_jsx(Heading,{level:`2`,id:`the-official-key`,children:`The official key`}),`\n`,_jsxs(_components.p,{children:[`Release builds of OpenIDEA carry the official publisher’s public key, built in from the release’s signing key. Plugins named `,_jsx(_components.code,{children:`openidea.*`}),` must be signed with it, or with a key it endorsed, whatever keys an index lists for `,_jsx(_components.code,{children:`openidea`}),`. Development builds from source have no built-in key and trust what the index says.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-review-exists`,children:`What review exists`}),`\n`,_jsx(Heading,{level:`3`,id:`official-plugins`,children:`Official plugins`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`openidea.*`}),` plugins live in `,_jsx(_components.a,{href:`https://github.com/l0ng-ai/openidea/tree/main/plugins/official`,children:_jsx(_components.code,{children:`plugins/official/`})}),`. Changes go through the repository’s normal pull request review and CI. CI rebuilds every plugin and fails when a checked-in component is stale (`,_jsx(_components.code,{children:`plugins/build.sh --check`}),`). The release workflow builds and signs them with the official key.`]}),`\n`,_jsx(Heading,{level:`3`,id:`community-registry`,children:`Community registry`}),`\n`,_jsxs(_components.p,{children:[`Community plugins are listed through `,_jsx(_components.a,{href:`https://github.com/l0ng-ai/openidea-plugins`,children:`l0ng-ai/openidea-plugins`}),`. Its rules:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`New publishers and new plugins`}),` are reviewed by a maintainer: the source, the capabilities it asks for and why, and that it doesn’t duplicate an existing plugin.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Version updates`}),` by an owner need passing checks and a maintainer’s merge. Owners are checked against the publisher file as it was before the pull request.`]}),`\n`,_jsx(_components.li,{children:`A plugin must have a public source repository under an open-source licence, and the package must be built from it. Its README must say what it does and why it needs each network, process or other high-risk capability. It must contain no obfuscated or minified code that isn’t built from that source.`}),`\n`,_jsxs(_components.li,{children:[`On every change, CI checks each package’s SHA-256, runs `,_jsx(_components.code,{children:`openidea-plugin check`}),` against the latest release, and verifies the signature against the publisher’s keys. A scheduled run repeats this daily.`]}),`\n`,_jsx(_components.li,{children:`A plugin that fails the checks against a new OpenIDEA release is reported in an issue and delisted if no fixed version is listed within 30 days.`}),`\n`,_jsx(_components.li,{children:`Maintainers revoke versions or keys for malware, a security problem the owner doesn’t fix, or a lost key. Owners ask for a revocation in an issue.`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`limits-of-the-review`,children:`Limits of the review`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Review is a human reading of the source and the requested capabilities. It is not a security audit.`}),`\n`,_jsx(_components.li,{children:`CI does not rebuild community packages from source. The rule that a package is built from its public source is checked in review, not by a reproducible build.`}),`\n`,_jsx(_components.li,{children:`The registry’s rules require a maintainer review of the source for new publishers and new plugins. For a version update they require passing checks and a maintainer’s merge; they don’t promise a fresh source review.`}),`\n`,_jsx(_components.li,{children:`Plugins installed from disk, linked folders, project plugins and self-hosted marketplaces get no review from OpenIDEA. The sandbox, the permission dialog and signatures still apply.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`reporting-a-problem`,children:`Reporting a problem`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A malicious or vulnerable community plugin: open an issue in `,_jsx(_components.a,{href:`https://github.com/l0ng-ai/openidea-plugins/issues`,children:`l0ng-ai/openidea-plugins`}),` asking for revocation.`]}),`\n`,_jsxs(_components.li,{children:[`A vulnerability in the plugin host or sandbox itself: see `,_jsx(_components.a,{href:`/en/contribute/security`,children:`Security`}),`.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Policy and security","description":"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.","href":"/en/plugins/publishing/policy"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Sandbox and consent","slug":"sandbox-and-consent","depth":2,"children":[]},{"title":"Signatures and publishers","slug":"signatures-and-publishers","depth":2,"children":[]},{"title":"Updates and signer changes","slug":"updates-and-signer-changes","depth":2,"children":[]},{"title":"Key rotation","slug":"key-rotation","depth":2,"children":[]},{"title":"Revocation","slug":"revocation","depth":2,"children":[]},{"title":"The official key","slug":"the-official-key","depth":2,"children":[]},{"title":"What review exists","slug":"what-review-exists","depth":2,"children":[{"title":"Official plugins","slug":"official-plugins","depth":3,"children":[]},{"title":"Community registry","slug":"community-registry","depth":3,"children":[]},{"title":"Limits of the review","slug":"limits-of-the-review","depth":3,"children":[]}]},{"title":"Reporting a problem","slug":"reporting-a-problem","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"openidea","siteName":"OpenIDEA","title":"Policy and security - OpenIDEA","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/plugins/publishing/policy","matchLevel":0},"zh":{"href":"/zh/plugins/publishing/policy","matchLevel":1}}},"lastModified":"2026-11-10T13:15:15.394Z","originalFileLocation":"en/plugins/publishing/policy.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.\">\u003cmeta data-mint-head name=\"application-name\" content=\"OpenIDEA\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Policy and security - OpenIDEA\">\u003cmeta data-mint-head property=\"og:description\" content=\"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OpenIDEA\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://openidea.sh/en/plugins/publishing/policy\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://openidea.mintlify.site/_mintlify/api/og/v2?division=Publish\u0026amp;title=Policy+and+security\u0026amp;description=The+plugin+trust+model%3A+sandbox+and+consent%2C+publisher+signatures%2C+revocation%2C+key+rotation%2C+the+official+key%2C+and+what+review+plugins+get.\u0026amp;theme=1e79528d9c677c294901aa3f\u0026amp;signature=3c619049697ca061a6578040c89fb7283b2a74ad5bae12b7d8b6ff046a2555ed\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Policy and security - OpenIDEA\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://openidea.mintlify.site/_mintlify/api/og/v2?division=Publish\u0026amp;title=Policy+and+security\u0026amp;description=The+plugin+trust+model%3A+sandbox+and+consent%2C+publisher+signatures%2C+revocation%2C+key+rotation%2C+the+official+key%2C+and+what+review+plugins+get.\u0026amp;theme=1e79528d9c677c294901aa3f\u0026amp;signature=3c619049697ca061a6578040c89fb7283b2a74ad5bae12b7d8b6ff046a2555ed\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/openidea/9AJ8ATO7sH33l3ls/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OpenIDEA\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3871E1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://openidea.sh/en/plugins/publishing/policy\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/plugins/publishing/policy.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://openidea.sh/en/plugins/publishing/policy\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://openidea.sh/zh/plugins/publishing/policy\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://openidea.sh/en/plugins/publishing/policy\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://openidea.sh/#organization\",\"name\":\"OpenIDEA\",\"url\":\"https://openidea.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/openidea/wPxqSmDfBpsYEW4W/logo/light.svg?fit=max\u0026auto=format\u0026n=wPxqSmDfBpsYEW4W\u0026q=85\u0026s=e8b1130beea815a3ea47ad655940657c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://openidea.sh#website\",\"name\":\"OpenIDEA\",\"url\":\"https://openidea.sh\",\"publisher\":{\"@id\":\"https://openidea.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://openidea.sh/en/plugins/publishing/policy#webpage\",\"url\":\"https://openidea.sh/en/plugins/publishing/policy\",\"name\":\"Policy and security\",\"description\":\"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.\",\"dateModified\":\"2026-11-10T13:15:15.394Z\",\"isPartOf\":{\"@id\":\"https://openidea.sh#website\"},\"breadcrumb\":{\"@id\":\"https://openidea.sh/en/plugins/publishing/policy#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://openidea.sh/en/plugins/publishing/policy#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Publish\",\"item\":\"https://openidea.sh/en/plugins/publishing/packaging\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Policy and security\",\"item\":\"https://openidea.sh/en/plugins/publishing/policy\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://openidea.sh/en/plugins/publishing/policy#article\",\"headline\":\"Policy and security\",\"name\":\"Policy and security\",\"description\":\"The plugin trust model: sandbox and consent, publisher signatures, revocation, key rotation, the official key, and what review plugins get.\",\"url\":\"https://openidea.sh/en/plugins/publishing/policy\",\"mainEntityOfPage\":{\"@id\":\"https://openidea.sh/en/plugins/publishing/policy#webpage\"},\"dateModified\":\"2026-11-10T13:15:15.394Z\",\"publisher\":{\"@id\":\"https://openidea.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://openidea.sh#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OpenIDEA\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OpenIDEA","nav":{"global":null,"languages":[{"language":"en","default":true,"tabs":[{"tab":"Guide","pages":[{"title":"Guide","href":"/en"}]},{"tab":"Languages","pages":[{"title":"Languages","href":"/en/languages"}]},{"tab":"Plugins","groups":[{"group":"Get started","pages":[{"title":"Overview","href":"/en/plugins"},{"title":"Quickstart","href":"/en/plugins/quickstart"},{"title":"Example plugins","href":"/en/plugins/examples"}]},{"group":"Concepts","pages":[{"title":"Architecture and sandbox","href":"/en/plugins/architecture"},{"title":"Manifest","href":"/en/plugins/manifest"},{"title":"Permissions and capabilities","href":"/en/plugins/capabilities"},{"title":"Lifecycle and events","href":"/en/plugins/lifecycle"},{"title":"API versions and compatibility","href":"/en/plugins/versioning"}]},{"group":"Extension points","pages":[{"title":"Commands and actions","href":"/en/plugins/guides/commands"},{"title":"Language features","href":"/en/plugins/guides/language-features"},{"title":"Diagnostics and inspections","href":"/en/plugins/guides/diagnostics"},{"title":"Views and decorations","href":"/en/plugins/guides/views"},{"title":"File actions","href":"/en/plugins/guides/file-actions"},{"title":"Run targets","href":"/en/plugins/guides/run-targets"},{"title":"Indexing","href":"/en/plugins/guides/indexing"},{"title":"Databases","href":"/en/plugins/guides/database"},{"title":"MCP tools","href":"/en/plugins/guides/mcp"},{"title":"Themes","href":"/en/plugins/guides/themes"},{"title":"Icon themes","href":"/en/plugins/guides/icon-themes"}]},{"group":"Develop","pages":[{"title":"Testing and debugging","href":"/en/plugins/testing"}]},{"group":"Publish","pages":[{"title":"Packaging and signing","href":"/en/plugins/publishing/packaging"},{"title":"Publish to the marketplace","href":"/en/plugins/publishing/marketplace"},{"title":"Self-hosted marketplace","description":"Run your own plugin marketplace: a static index.json next to the packages, built and maintained with openidea-plugin.","href":"/en/plugins/publishing/self-hosted"},{"title":"Policy and security","href":"/en/plugins/publishing/policy"}]},{"group":"Reference","pages":[{"title":"API reference","description":"Every interface of the openidea:plugin WIT package, with a one-line summary and a link to its source.","href":"/en/plugins/api/index"}]}]},{"tab":"Contribute","pages":[{"title":"Contribute","href":"/en/contribute/setup"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/en/changelog"}]}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/plugins/publishing/policy"}]}]},"basePath":"","title":"Policy and security - OpenIDEA","buildId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","deploymentId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","dynamics":[],"chunks":[]}