Skip to content

Marketplace and Addons

The Shoehorn Marketplace lets you browse, install, and manage extensions that add widgets, integrations, and functionality to the platform. Addons are self-contained bundles that run inside Shoehorn with their own routes, frontend components, and webhook handlers. alpha

Navigate to Admin > Addons to browse available items.

You can filter by:

  • Kind: widget, integration, addon
  • Category: monitoring, ci-cd, project-management, security, etc.
  • Tier: declarative, scripted, full
  • Search: free-text search across name and description

Each item shows its name, description, author, tier, and whether it is installed.

  1. Find the addon in the marketplace catalog
  2. Click the addon card to see details
  3. Click Install
  4. Configure any required settings (API keys, URLs, etc.)
  5. The addon is activated for your tenant

Installed addons appear under Admin > Addons with their status (enabled/disabled).

For each installed addon you can:

  • Enable / Disable, toggle the addon on or off without uninstalling
  • Configure, update settings like API keys or connection URLs
  • View logs, check addon execution logs for debugging
  • View status, see health and last execution info
  • Uninstall, remove the addon and its data

Some addons need credentials (API tokens, passwords). Set these in Admin > Addons > [addon] > Secrets. Secrets are stored encrypted and injected into the addon runtime. They are never exposed in the UI after being saved.

TierWhat it can doExample
declarativeConfiguration-only, no custom codeDashboard widget pulling from an API
scriptedJavaScript/TypeScript with SDK helpers, webhook handlersJira issue sync, PagerDuty integration
fullComplete control over rendering, routing, dataCustom portal pages

Addons can provide dashboard widgets. Once installed, widgets appear in the widget picker when customizing your dashboard or team dashboards.

Installed widgets are available at Admin > Addons > Installed Widgets or via the API:

GET /api/v1/marketplace/installed/widgets

There are three ways to get addons into your instance:

From the marketplace registry, click Install on any catalog item.

Import from manifest, paste an addon manifest JSON to install a custom addon not in the registry:

POST /api/v1/marketplace/import-manifest

Upload a bundle, upload a built addon bundle (.tar.gz or .zip) directly:

POST /api/v1/marketplace/{slug}/bundle

Scripted and full-tier addons run in a sandboxed QuickJS VM with access to platform services via the ctx global. Capabilities are permission-gated, addons only receive what they declare in their manifest.

Core capabilities (always available or via basic scopes)

Section titled “Core capabilities (always available or via basic scopes)”
CapabilityDescription
ctx.logStructured logging (info, warn, error, debug)
ctx.configRead-only text configuration set by admins
ctx.secretsRead-only encrypted secrets (AES-256-GCM)
ctx.httpSynchronous HTTP client (restricted to declared URLs)
ctx.entitiesCatalog entity CRUD (list, get, upsert, delete)
ctx.addonAddon metadata (id, version, tier)

Adapter capabilities (optional, permission-gated)

Section titled “Adapter capabilities (optional, permission-gated)”

These are injected into the addon VM only when the corresponding permission scope is declared in manifest.json. They provide direct access to platform backing services.

CapabilityBacking ServicePermission ScopesUse Case
ctx.cacheValkey (Redis)cache:read, cache:writeCache API responses, deduplication, rate limiting
ctx.eventsRedpanda (Kafka)events:publish, events:subscribeEmit events for other services, react to platform changes
ctx.dbPostgreSQLdb:readCustom read-only queries against tenant-scoped platform data
ctx.searchMeilisearchsearch:readFull-text search over indexed platform data
ctx.kvPostgreSQL JSONBkv:read, kv:writePersistent addon state (sync cursors, per-entity data)
ctx.notificationsPlatform pushnotifications:sendSend in-app notifications to users or broadcast to teams

To use an adapter, add its permission scopes to the manifest:

{
"addon": {
"permissions": {
"shoehorn": ["entities:read", "cache:read", "cache:write", "kv:read", "kv:write"]
}
}
}

See the Addon SDK documentation for full API reference and examples.

Use the Addon SDK to create custom addons:

Terminal window
npx @shoehorn-dev/addon-sdk init my-addon
cd my-addon
npm install
npm run build
shoehorn addon publish --dir .

See Ecosystem and Tools for SDK details and the jira-sync addon for a production example.

ScopeWhat it allows
marketplace:readBrowse marketplace, view installed items
marketplace:writeInstall, enable, disable addons
marketplace:adminPublish addons, upload bundles, manage secrets

Declared in the addon’s manifest.json under permissions.shoehorn:

ScopeWhat it unlocks
secrets:readAccess to encrypted secrets via ctx.secrets
entities:readRead catalog entities via ctx.entities.get/list
entities:writeCreate/update/delete entities via ctx.entities.upsert/delete
cache:readRead from cache via ctx.cache.get/has
cache:writeWrite to cache via ctx.cache.set/delete
events:publishPublish events via ctx.events.publish
events:subscribeSubscribe to events via ctx.events.subscribe
db:readRun read-only SQL queries via ctx.db.query
search:readSearch indexed data via ctx.search.search
kv:readRead from persistent KV store via ctx.kv.get/list/has
kv:writeWrite to KV store via ctx.kv.set/delete
notifications:sendSend notifications via ctx.notifications.send/broadcast