Publishing
There are three ways to get your plugin onto hub.sigmashake.com/plugins — pick the one that matches your workflow.
| Method | Best for | Time |
|---|---|---|
ssg plugins publish | First time, or any normal release | < 1 minute |
| Web form | One-off, no CLI handy | 2 minutes |
| REST API | CI/CD pipelines, scripted releases | Automatable |
All three paths terminate at the same place: a row in the hub's plugins
table, which is what ssg plugins install <id> queries.
ssg plugins publish
The intended happy path. From your plugin project directory:
ssg plugins publish
What it does, in order:
- Runs
ssg plugins buildto make sure the artifact and manifest are fresh - Checks
ghCLI auth (errors with a helpful message if you needgh auth login) - Creates
github.com/<you>/ssg-plugin-<id>if it doesn't exist (private) - Commits your plugin source and pushes
- Creates release
v<version>and uploads<id>-<version>.tar.gz+plugin.jsonas release assets - Opens
https://hub.sigmashake.com/submit-plugin?…in your browser with every field pre-filled
The web form is the final step — you click Publish plugin and the row is written. The reason it's a form (rather than the CLI POSTing directly) is so you can review the metadata one more time and tweak the description before it hits the public marketplace.
Flags
ssg plugins publish --repo=my-org/cool-plugin # use a non-default repo
ssg plugins publish --no-browser # print URL, don't open browser
Re-publishing the same version
ssg plugins publish is idempotent for the GitHub side: if the release tag
already exists, it re-uploads the assets with --clobber. The hub side, by
contrast, rejects duplicate versions — bump version in plugin.toml
before re-publishing.
Publishing a new version
# 1. Bump version
$EDITOR plugin.toml
# 2. Re-publish
ssg plugins publish
Users uninstall + reinstall to pick up the new version. (Automatic update flow lands in v2.)
Web form
If you want to host the artifact somewhere other than GitHub Releases (R2, S3, GitLab Releases, etc.) you can submit manually:
- Build locally:
ssg plugins build - Upload
dist/<id>-<version>.tar.gzanddist/plugin.jsonwherever you want them served from. Constraint:manifest_urlmust be onraw.githubusercontent.comorhub.sigmashake.com, butartifact_urlcan point to any HTTPS host. - Open hub.sigmashake.com/submit-plugin
- Sign in with GitHub
- Fill in the form with the URLs and metadata
- Click Publish plugin
The hub will refuse the submission if:
- The signing fingerprint on the form doesn't match the key registered to your hub account
- The
manifest_urlandartifact_urlpoint to different GitHub repos (when using GitHub-hosted artifacts) - The id slug is already taken by a different author
REST API
For CI/CD pipelines:
curl -X POST https://hub.sigmashake.com/api/plugins/submit \
-H "Authorization: Bearer $GH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": "my-plugin",
"name": "My Plugin",
"description": "A short description.",
"category": "tools",
"version": "0.1.0",
"min_ssg_version": "0.29.0",
"manifest_url": "https://raw.githubusercontent.com/owner/repo/v0.1.0/dist/plugin.json",
"artifact_url": "https://github.com/owner/repo/releases/download/v0.1.0/my-plugin-0.1.0.tar.gz",
"artifact_sha256": "<64 hex chars>",
"signing_fingerprint": "<hex SPKI public key>",
"repo_url": "https://github.com/owner/repo"
}'
The Authorization header must be a GitHub personal access token (classic or
fine-grained) with public_repo scope. The hub uses this to confirm you have
push access to the repository backing the artifact.
Error responses
| Status | Meaning |
|---|---|
| 200 | Success — response contains hub_url |
| 400 | Bad payload — see the error field |
| 401 | Missing or invalid GitHub token |
| 403 | You don't have push access to the repo, or the signing key doesn't match your account |
| 413 | Request body > 64 KB |
| 429 | Rate limit — max 5 submissions/hour/IP |
Get the signing fingerprint and SHA-256 in a script
ARTIFACT="dist/my-plugin-0.1.0.tar.gz"
SHA256=$(shasum -a 256 "$ARTIFACT" | cut -d' ' -f1)
PUBKEY=$(ssg keys show)
SIG=$(printf "%s" "$SHA256" | ssg keys sign)
echo "sha256: $SHA256"
echo "fingerprint: $PUBKEY"
echo "signature: $SIG"
These are exactly the same values ssg plugins build writes into
dist/plugin.json — you can also just jq -r them out:
jq -r '.artifact_sha256, .signing_fingerprint, .artifact_signature' dist/plugin.json
After publishing
Once the plugin is live, it's immediately installable from any SSG dashboard:
ssg plugins install my-plugin
Direct URL: https://hub.sigmashake.com/plugin/my-plugin.
Unpublishing
To remove a plugin from the marketplace, open a support ticket
(ssg support --title="Unpublish plugin <id>"). Author-initiated unpublish is
honored within one business day. Existing installs continue to work until the
user runs ssg plugins uninstall <id> — the hub doesn't push uninstalls to
clients.