Reviewed against the Stream Deck SDK and Marketplace guidelines on 1 Nov 2026. streamdeck validate is the mechanical check; a person still submits in Maker Console.
Models for a small, recently accepted plugin that shows remote data on a key:
| Rule | How this plugin satisfies it | Source | Rejection risk |
|---|---|---|---|
| UUID is reverse-DNS, lowercase, and includes the organization and product. Action UUIDs start with the plugin UUID. | com.coworkingview.prices, com.coworkingview.prices.workspace-count, com.coworkingview.prices.market-rate. | Plugin guidelines — UUIDs, Manifest | Changing a UUID after publish breaks updates. Do not rename them in a later version. |
| Name is unique, English, capitalized, at most about 30 characters, and describes the function. | Coworking Prices (16). | Product guidelines — Name, Plugin guidelines — Name | The name may already be taken. A person has to search Marketplace before submit. Names cannot be edited later without maker@elgato.com. |
| Do not put the maker name, the word Plugin, a price, or promotional words in the name. | Name has none of those. | Product guidelines — Name | Adding "CoworkingView" or "Plugin" to the Marketplace title. |
| Author is the Marketplace organization name. | Manifest Author is CoworkingView. | Plugin guidelines — Author | The Maker Console organization must be named CoworkingView. A personal name will not match. |
Version is {major}.{minor}.{patch}.{build}. | 1.0.0.0. | Manifest — Version | A three-part version fails validate. |
| Category is set and matches the plugin name. No author name in the category. | Category Coworking Prices. | Plugin guidelines — Naming | Leaving the category empty files the actions under Custom. |
| Two to thirty configurable actions, with tooltips, names around 30 characters. | Workspace Count and Market Rate. Both have tooltips and a property inspector. | Plugin guidelines — Grouping | Shipping a single static key, or dozens of near-duplicate keys. |
URL and SupportURL are the real site. | Both are https://coworkingview.com. | Manifest — URL / SupportURL. SupportURL is shown as help above the inspector since Stream Deck 6.9. | A dead link, a www host, or a missing support URL. |
| Description states what it does, who it is for, and the requirements. English. First 250 characters are a finished, unformatted pitch. 250–1,500 characters on the product page. | Manifest description is 510 characters and character 250 is the period after "browser". The paste-ready listing is in docs/STREAMDECK-LISTING.md. | Product guidelines — Description, Manifest — Description | Cutting the URL mid-word in the first 250 characters, keyword stuffing, or an AI-sounding description that does not match the keys. |
| SDK 3, Node.js 24, Stream Deck 7.1 minimum. | SDKVersion 3, Nodejs.Version "24", Software.MinimumVersion "7.1". Node 24 is available from Stream Deck 7.1 (runtime 24.13.1). Current getting-started requires Node 24. | Getting started, Plugin environment — runtimes, Manifest | Declaring Node 24 with a minimum below 7.1. The plugin will not start on Stream Deck 6.9 or 7.0. That narrower audience is intentional. |
| OS minimums are real. | macOS 12, Windows 10, same floor as the current SDK samples and as Fetcher. | Manifest — OS | Claiming an older macOS than the build was tried on. Nobody has run this build on a device yet. |
| Code path is the bundled plugin. | CodePath is bin/plugin.js, with bin/package.json set to "type": "module". Built with @elgato/streamdeck and rolldown, standard decorators. | Distribution, Getting started | Packing the plugin before npm run build, so plugin.js is missing. CI builds, then validates, then packs. |
streamdeck validate passes. | CI job Stream Deck plugin runs npm run validate (streamdeck validate --no-update-check). A local run on 1 Nov 2026 with @elgato/cli 1.10.4 printed Validation successful. | Distribution | Skipping validate, or validating a stale manifest schema because the CLI could not update. CI pins the check to the schema shipped with @elgato/cli. |
| Rule | How this plugin satisfies it | Source | Rejection risk |
|---|---|---|---|
| Plugin icon PNG at 256 and 512, extension omitted in the manifest. | imgs/plugin/marketplace.png and marketplace@2x.png. | Plugin guidelines — Icon | JPEG, or a single size. |
Category icon 28 and 56. Action list icons 20 and 40. White #FFFFFF on transparency. | imgs/plugin/category-icon, imgs/actions/workspace-count/icon, imgs/actions/market-rate/icon, plus @2x. scripts/make-icons.py recolors the mark to white and checks the pixels. | Plugin guidelines — Icons | A colored or solid-background list icon. SVG would scale more cleanly; these are PNG, which the guidelines allow and which validate checks. |
| Key image 72 and 144, PNG, SVG, or GIF. | key.png and key@2x.png for each action. Title sits at the bottom; the mark stays in the upper area. | Plugin guidelines — Key icons | Updating the key image many times a second. This plugin only sets the title. |
| Marketplace app icon is a separate 288 × 288 PNG. Logo or name is the focus. No "Official". No URL text. | integrations/streamdeck/marketplace/app-icon-288.png, drawn from integrations/nextcloud/coworkingview/img/app.png (black serif CV, gold dot). | Product guidelines — App icon | Uploading the 256 px manifest icon instead of the 288 px file, or a red square that is not this mark. |
| Thumbnail and at least three gallery images, 1920 × 960 PNG, English, rights owned. | marketplace/thumbnail.png plus gallery-keys.png, gallery-workspace-count.png, and gallery-market-rate.png. Each is labeled RENDERING and uses neutral rounded keys. The Berlin titles are the live catalogue total and flex desk median. | Product guidelines — Thumbnails and Gallery | A reviewer can still ask for a photograph from the app. These files avoid a branded device on purpose. |
| Rule | How this plugin satisfies it | Source | Rejection risk |
|---|---|---|---|
| Single-select settings use a select. Settings save on change. No Save button. No donation link. | City and figure are <sdpi-select setting="...">. The website control only opens the site. sdpi-components.js v4 is vendored. | Plugin guidelines — Property inspectors | A Save button, or a Ko-fi link in the inspector. |
| Separate inspectors so unused controls are absent. | ui/workspace-count.html has city. ui/market-rate.html has city and figure. | Plugin guidelines — Property inspectors | One shared file that shows the figure select on Workspace Count. |
| City list comes from data the API published. | sendToPropertyInspector returns { event: "getCities", items } from GET /v1/market/rates?locale=en. If that call fails, the only option is Berlin, which is a real city. | Settings, Property inspector events | Inventing cities. |
Failure uses showAlert. Success is the new title, so there is no showOk. | showUnavailable sets the title to an em dash and alerts when the user just opened the key or changed settings. The 30 minute refresh logs the error and does not alert on every tick. | Plugin guidelines — Temporary feedback | Alerting every half hour while the API is down. |
| User titles stay off so the live title is not overwritten by a custom label. | UserTitleEnabled is false. Keypad only. | Manifest — Actions | Letting a custom title hide the number the action exists to show. |
| Press opens the canonical site. | streamDeck.system.openUrl("https://coworkingview.com"). | Product request, and the support link in the listing. | Opening https://www.coworkingview.com. |
| Only real response fields are shown. | Inspected GET /v1/market/rates and GET /v1/properties on 1 Nov 2026. locale is required. Count is meta.pagination.total (Berlin was 143). Rate is median.amount and median.currency (Berlin flex desk median was 214 EUR on asOf 2026-10-30T13:21:31.959Z). Amounts are not re-rounded. data.propertyCount on the rates index is a different number and is not displayed. Tests read integrations/streamdeck/fixtures/. | Live API https://api.coworkingview.com. Plugin guidelines | Showing the index propertyCount, a sample size, or a made-up average as the workspace count. |
| Refresh is infrequent. | 30 minutes (REFRESH_INTERVAL_MS). The API cache headers are shorter (about 5–10 minutes). One retry on HTTP 429 or 5xx, capped at 10 seconds. Timeout 20 seconds. User-Agent coworkingview-streamdeck/1.0.0. | Fetcher listing polls and caches. Rate limit on the public API is 120 requests per 60 seconds. | Polling every few seconds from many keys. |
| No operator catalogue content. | The properties request uses pageSize=1 and the parser keeps total, city name, and citation text. Titles, excerpts, and images are dropped. | Repository data rules for the public catalogue. | Rendering a listing photo or description on the key. |
| CC BY 4.0 attribution stays with the rates. | data.attribution is logged on every fresh rates response. The listing states the license. | Rates payload license / licenseUrl / attribution. | Stripping the attribution string. |
| Rule | How this plugin satisfies it | Source | Rejection risk |
|---|---|---|---|
| Do not collect analytics or identifiable data without consent, a privacy policy, and a way to delete it. | The plugin stores the chosen city and figure in Stream Deck's own action settings. It does not send an account, a device id, or analytics. Requests go to https://api.coworkingview.com. | Product guidelines — Data & security | Adding telemetry later without a privacy link. |
| Privacy policy link on the product. | The site already publishes https://coworkingview.com/en/privacy. Attach it as an additional link even though the plugin does not collect accounts. | Product guidelines — Data & security | Leaving the additional-links section empty. |
| Price has no external paywall. | Free. | Product guidelines — Pricing | A listing that tells people to subscribe before the keys work. |
| Rights to the mark. | Icons are derived from the CoworkingView logo already in this repository. | Product guidelines — Legal | Substituting another brand's icon. |
| AI assistance is declared. Products made entirely with AI are ineligible. | This plugin was written with AI assistance, then checked against the live API, the SDK types, and streamdeck validate. The gallery images are labeled renderings. Say that in Maker Console. | Product guidelines — AI usage | Submitting without the declaration. |
| Debug inspector is only for debug runs. | Nodejs.Debug is "enabled", which the manifest schema applies when the plugin is started in debug mode. The same value is in the current SDK samples. | Manifest — Nodejs.Debug, Plugin environment sample | Low. It does not open a debugger for customers. |
Author, and accept the Maker Agreement under organization settings.com.coworkingview.prices.streamDeckPlugin from the CI artifact on this pull request. streamdeck pack names the file from the UUID.docs/STREAMDECK-LISTING.md.integrations/streamdeck/marketplace/app-icon-288.png.integrations/streamdeck/marketplace/. They are renderings of the live Berlin figures, not photographs of hardware.Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |