Files
Dylan M. Taylor c30fb9aeed Sonar: [[ in the plugin-catalog check, Number.* in the boa runtimes, no Invoke-Expression (S7688, S7773, S8659) (#3427)
Clears all 29 open SonarCloud issues.

- `examples/plugin-catalog/scripts/validate.sh`: `[[ ]]` in place of `[ ]` for bash tests (SonarCloud shell:S7688). Every script has a bash shebang; no test uses `-a`/`-o`, escaped parentheses or an unquoted pattern on the right of `=`.
- `crates/expr/src/prelude.js`, `crates/script/src/prelude.js`, `crates/script/src/scriptui.js`: `Number.isFinite` / `Number.isNaN` / `Number.parseInt` (javascript:S7773). Every call already has a number (a `typeof` check or `Number()` before it), and `Number.parseInt === parseInt`, so nothing changes in boa.
- `packaging/windows/test-legacy-fixture.ps1`: dot-sources `[scriptblock]::Create($block)` in place of `Invoke-Expression $block` (powershelldre:S8659). It runs in the same scope, so `$LegacyWxs` is still set after it.
- `sonar-project.properties`: S7773 and S8786 are not raised on `*.jsx`. Those are After Effects ExtendScript (ES3), which also runs in After Effects and has no `Number.isFinite` or `String.prototype.trim`. The ignore covers 7 issues in `Ease Presets.jsx` and `Rename Layers.jsx`.
2026-11-10 19:04:34 -05:00
..

EffectCraft plug-ins

The community catalog of WebAssembly effect plug-ins for EffectCraft. The app's Plug-in Library (Settings ▸ Plug-in Library) reads index.json from this repository, then downloads, checks and installs the packages people pick. Plug-ins run in EffectCraft's sandbox: they can't read files, open the network or crash the app.

This repository holds only the catalog. Each plug-in's code and .wasm live in its author's repository, attached to a GitHub release.

Submit a plug-in

  1. Build your plug-in and attach the .wasm to a GitHub release. The full guide is Publishing plug-ins.
  2. Add one entry to the packages array of index.json. example-entry.json shows every field; schema.json is the exact format. To publish a new version, add a release to your package's versions rather than editing an old one.
  3. Check it locally: scripts/validate.sh (needs bash, jq, curl, sha256sum and Node; set EFFECTCRAFT_CLI to an effectcraft-cli build to also install it with the real loader).
  4. Open a pull request. CI runs the same script; a maintainer reviews the rest.

Review checklist (maintainers)

CI checks the format, unique ids, each download's size and SHA-256, and that EffectCraft installs and loads the package. Before merging, also check:

  • The id is new, stable and names the author (reverse domain style: io.github.user.name). Ids never change and are never reused.
  • repo is a public repository with the plug-in's source, and its licence is open (the license field matches it).
  • Every url is a release asset of that repository (not a branch file, which can change).
  • The release builds from the tagged source; spot-check large or obfuscated modules.
  • effects lists the effect ids the module registers, and they don't clash with another package's.
  • name, description and tags are accurate; no Adobe names, logos or assets.
  • preview.video, if given, is a short demo of the effect hosted on GitHub or a well-known video site.
  • A change to an existing package comes from its author (or with their agreement), and old releases keep their url and SHA-256.

Create this repository from the template

The template lives in EffectCraft at examples/plugin-catalog/.

  1. Create the empty public repository storytold/effectcraft-plugins (branch main, so the app's catalog URL https://raw.githubusercontent.com/storytold/effectcraft-plugins/main/index.json resolves).
  2. Copy README.md, index.json, example-entry.json, schema.json and scripts/ to its root, and validate.yml to .github/workflows/validate.yml.
  3. Keep scripts/validate.sh executable (git update-index --chmod=+x scripts/validate.sh).
  4. Protect main: require pull requests and the Validate check.