The Projelli marketplace is two public GitHub repos. Templates live at projelli/community-templates, plugins at projelli/community-plugins. Each entry is one folder under entries/ with a manifest, the entry's files, and screenshots. To publish, you fork the relevant repo, add your folder, and open a pull request.
id in your manifest that doesn't collide with any existing entry.Templates and plugins live in different repos because they have different schemas and different review criteria.
gh repo fork projelli/community-templates # or community-plugins
cd community-templates
git checkout -b add-my-entry
Create a folder under entries/ matching your manifest's id:
entries/my-template/
manifest.json
template.md
workflow.json
questions.json
screenshots/
main.png
entries/my-plugin/
manifest.json
index.js (your built bundle)
screenshots/
main.png
The folder name must exactly match manifest.id. The build script enforces this.
Templates use the TemplateManifest schema; plugins use the PluginManifest schema. Both repos' READMEs show a complete example.
Fields you'll always need: id, name, version (semver), apiVersion, author, description, category, tags, and minProjelliVersion.
Plugins additionally declare main (the JS entry path) and permissions (what host capabilities the plugin needs). See the permissions reference for details on which permissions are surfaced to the user at install time and how to keep that list short.
Both repos ship the same scripts/build-catalog.mjs. Run it from the repo root:
npm install --no-save zod@^4.3.6
# templates repo
PROJELLI_CATALOG_KIND=templates node scripts/build-catalog.mjs
# plugins repo
PROJELLI_CATALOG_KIND=plugins node scripts/build-catalog.mjs
If your manifest validates, the script writes catalog.json plus a tarball and checksum inside your entry folder. If it fails, you'll see a list of validation errors with the field path and reason. Fix and re-run.
You can leave the generated tarball and checksum out of your PR; the GitHub Action regenerates them after merge so the catalog stays consistent.
git add entries/my-entry/
git commit -m "Add my-entry v1.0.0"
git push origin add-my-entry
gh pr create --base main
Use this title format: Add <name> v<version>.
In the PR description, include:
network: which hosts the plugin contacts and what data is sent.A maintainer reviews every submission. Reviews focus on:
build-catalog.mjs on every PR. If it fails, the PR can't merge.Most reviews finish within a few days. If we ask for changes, push another commit to the same branch and the PR updates automatically. Once merged, the Action regenerates catalog.json and your entry appears in the in-app marketplace on the next refresh.
Bump version in your manifest, update the files, and open a PR. Don't change the entry's id or rename the folder; that breaks installs for users on the old version.
Open a PR that deletes the entry folder. Existing installs in user copies of Projelli keep working; the entry just disappears from the marketplace.
If you find an entry that's broken, misleading, or doing something it shouldn't be doing, open an issue on the relevant repo with the entry id and details. We take takedowns seriously when a plugin violates the trust model.
Plugin-specific publishing guide →