[{"data":1,"prerenderedAt":49},["ShallowReactive",2],{"doc:en:plugins\u002Ffaq":3},{"title":4,"lede":5,"html":6,"headings":7},"Plugins FAQ","The questions that come back about plugins, for those who install them and for those who write them, with a pointer to the page that details each answer.","\u003Ch2 id=\"for-the-user\">For the user\u003C\u002Fh2>\n\u003Ch3 id=\"do-i-need-node-to-run-a-plugin\">Do I need Node to run a plugin?\u003C\u002Fh3>\n\u003Cp>No: a plugin of the store runs inside the app, in WASM, whether it is written in TypeScript (\u003Ccode class=\"key\">run.js\u003C\u002Fcode>) or in Rust (\u003Ccode class=\"key\">run.wasm\u003C\u002Fcode>). Only a plugin installed from a folder or a git repository whose command names \u003Ccode class=\"key\">node\u003C\u002Fcode> needs it; the store refuses that form. Slack and Team rules, two of the \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fexamples\u002F\">example plugins\u003C\u002Fa>, run as \u003Ccode class=\"key\">run.js\u003C\u002Fcode> since their 2.0.0.\u003C\u002Fp>\n\u003Ch3 id=\"verified-by-escouade-unverified-what-is-the-difference\">“Verified by Escouade”, “Unverified”: what is the difference?\u003C\u002Fh3>\n\u003Cp>A verified version was reviewed by Escouade and signed; the app checks the signature itself, without trusting the store. An unverified version passed the store’s automatic checks, but nobody read its code; a plugin installed from a folder or a git repository always is. See \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fsecurity\u002F\">plugin security\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"can-a-plugin-see-my-private-projects\">Can a plugin see my private projects?\u003C\u002Fh3>\n\u003Cp>Not from the start: a plugin you install is off in every private project, and nothing of that project is sent to it until you switch it on there. A \u003Ccode class=\"key\">run.command\u003C\u002Fcode> program still has your rights on the disk (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fpermissions\u002F\">permissions\u003C\u002Fa>). The plugins shipped with Escouade are on there, like the rest of the app.\u003C\u002Fp>\n\u003Ch3 id=\"how-do-i-stop-a-plugin-that-does-something-i-do-not-want\">How do I stop a plugin that does something I do not want?\u003C\u002Fh3>\n\u003Cp>Its switch, in the Plugins view, stops it for the whole app; its Projects tab, for one project; its Permissions tab takes one permission back. Its journal says what it did. A plugin shipped with Escouade is switched off the same way.\u003C\u002Fp>\n\u003Ch3 id=\"can-a-project-install-a-plugin-for-me\">Can a project install a plugin for me?\u003C\u002Fh3>\n\u003Cp>No. Its \u003Ccode class=\"key\">.escouade.yml\u003C\u002Fcode> can propose some (\u003Ccode class=\"key\">plugins.recommended\u003C\u002Fcode>): Settings › Projects shows them, and the install always goes through the window that says their permissions (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fescouade-yml\u002F#plugins\">\u003Ccode class=\"key\">.escouade.yml\u003C\u002Fcode>\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"where-is-its-data\">Where is its data?\u003C\u002Fh3>\n\u003Cp>Its copy in \u003Ccode>~\u002F.escouade\u002Fplugins\u002F&lt;id&gt;\u002F\u003C\u002Fcode>, the list of plugins in \u003Ccode>~\u002F.escouade\u002Fplugins.json\u003C\u002Fcode>, its journal in \u003Ccode>~\u002F.escouade\u002Fplugin-logs\u002F&lt;id&gt;.log\u003C\u002Fcode>, its secrets in the system’s keychain (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fdata\u002F\">local data\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"for-the-author\">For the author\u003C\u002Fh2>\n\u003Ch3 id=\"which-language-should-i-write-a-plugin-in\">Which language should I write a plugin in?\u003C\u002Fh3>\n\u003Cp>None, when the manifest is enough: a theme, webhooks, an ACP harness. JS or TypeScript with \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fsdk\u002F\">the SDK\u003C\u002Fa>, published as \u003Ccode class=\"key\">run.js\u003C\u002Fcode>. Rust with \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Frust\u002F\">the kit\u003C\u002Fa>, published as \u003Ccode class=\"key\">run.wasm\u003C\u002Fcode>. The store takes no other language: the protocol stays open to any program, but it does not get published.\u003C\u002Fp>\n\u003Ch3 id=\"how-do-i-test-it-without-starting-escouade\">How do I test it without starting Escouade?\u003C\u002Fh3>\n\u003Cp>\u003Ccode>escouade-plugin test\u003C\u002Fcode> plays the conformance bench, \u003Ccode>escouade-plugin dev\u003C\u002Fcode> the fake Escouade, by hand; the SDK gives an in-memory fake for unit tests, and the Rust kit \u003Ccode class=\"key\">serve_on\u003C\u002Fcode> (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Ftesting\u002F\">testing a plugin\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"can-i-use-dev-escouade-as-an-id\">Can I use \u003Ccode class=\"key\">dev.escouade.*\u003C\u002Fcode> as an id?\u003C\u002Fh3>\n\u003Cp>No: it is kept for Escouade’s own plugins. Take a domain name of your own, reversed (\u003Ccode>io.github.&lt;your-login&gt;.my-plugin\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch3 id=\"can-it-add-a-panel-or-a-page-to-the-interface\">Can it add a panel or a page to the interface?\u003C\u002Fh3>\n\u003Cp>Not yet: a plugin adds what its manifest declares (themes, harnesses, settings…), drawn by Escouade.\u003C\u002Fp>\n\u003Ch3 id=\"do-i-need-an-account-to-publish\">Do I need an account to publish?\u003C\u002Fh3>\n\u003Cp>A GitHub account and a public repository: the store reads the version at its tag (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fpublishing\u002F\">publishing on the store\u003C\u002Fa>). An agent can also do it for you, through \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fstore-mcp\u002F\">the store’s MCP server\u003C\u002Fa>.\u003C\u002Fp>\n",[8,12,16,19,22,25,28,31,34,37,40,43,46],{"id":9,"text":10,"depth":11},"for-the-user","For the user",2,{"id":13,"text":14,"depth":15},"do-i-need-node-to-run-a-plugin","Do I need Node to run a plugin?",3,{"id":17,"text":18,"depth":15},"verified-by-escouade-unverified-what-is-the-difference","“Verified by Escouade”, “Unverified”: what is the difference?",{"id":20,"text":21,"depth":15},"can-a-plugin-see-my-private-projects","Can a plugin see my private projects?",{"id":23,"text":24,"depth":15},"how-do-i-stop-a-plugin-that-does-something-i-do-not-want","How do I stop a plugin that does something I do not want?",{"id":26,"text":27,"depth":15},"can-a-project-install-a-plugin-for-me","Can a project install a plugin for me?",{"id":29,"text":30,"depth":15},"where-is-its-data","Where is its data?",{"id":32,"text":33,"depth":11},"for-the-author","For the author",{"id":35,"text":36,"depth":15},"which-language-should-i-write-a-plugin-in","Which language should I write a plugin in?",{"id":38,"text":39,"depth":15},"how-do-i-test-it-without-starting-escouade","How do I test it without starting Escouade?",{"id":41,"text":42,"depth":15},"can-i-use-dev-escouade-as-an-id","Can I use dev.escouade.* as an id?",{"id":44,"text":45,"depth":15},"can-it-add-a-panel-or-a-page-to-the-interface","Can it add a panel or a page to the interface?",{"id":47,"text":48,"depth":15},"do-i-need-an-account-to-publish","Do I need an account to publish?",1793889382576]