Skip to main content

Publishing

There are three ways to get your plugin onto hub.sigmashake.com/plugins — pick the one that matches your workflow.

MethodBest forTime
ssg plugins publishFirst time, or any normal release< 1 minute
Web formOne-off, no CLI handy2 minutes
REST APICI/CD pipelines, scripted releasesAutomatable

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:

  1. Runs ssg plugins build to make sure the artifact and manifest are fresh
  2. Checks gh CLI auth (errors with a helpful message if you need gh auth login)
  3. Creates github.com/<you>/ssg-plugin-<id> if it doesn't exist (private)
  4. Commits your plugin source and pushes
  5. Creates release v<version> and uploads <id>-<version>.tar.gz + plugin.json as release assets
  6. 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:

  1. Build locally: ssg plugins build
  2. Upload dist/<id>-<version>.tar.gz and dist/plugin.json wherever you want them served from. Constraint: manifest_url must be on raw.githubusercontent.com or hub.sigmashake.com, but artifact_url can point to any HTTPS host.
  3. Open hub.sigmashake.com/submit-plugin
  4. Sign in with GitHub
  5. Fill in the form with the URLs and metadata
  6. 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_url and artifact_url point 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

StatusMeaning
200Success — response contains hub_url
400Bad payload — see the error field
401Missing or invalid GitHub token
403You don't have push access to the repo, or the signing key doesn't match your account
413Request body > 64 KB
429Rate 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.

See also