Publishing to the marketplace
Get a publisher handle, upload the widget zip, build the listing with screenshots, and get through review and later updates.
Publishing puts your widget in the in-app marketplace, where anyone can install it with one click after reviewing its permissions. The pipeline is deliberately simple on your side: zip the folder, fill in a listing, submit, and a human reviews it.
Before you start
Two prerequisites, both one-time:
- A purchased DeskDash account. Submissions are tied to paid accounts.
- A publisher handle, set from your account page on the website: 3 to 30 characters, lowercase letters, digits and dashes, starting with a letter or digit. Choose carefully; the handle is permanent, it becomes part of every widget id you publish, and it is shown as the author on your listings.
What you upload
A zip of the widget folder, from the Submit page on desktop-dashboard.com. Zipping the folder itself or just its contents both work. The caps:
- 3.5 MB for the zip
- 200 files, 5 MB per file, 12 MB total unpacked
OS junk (.DS_Store, Thumbs.db, macOS resource folders) is dropped
automatically, and so are the generated .deskdash/ folder and
jsconfig.json. Those are development files: your editor reads them, a
published widget does not need them (the app serves the dd-tokens.css
import path itself, so a scaffolded stylesheet keeps working without the
folder). Zip them or leave them out as you like. They never count against
the limits above, and they never reach the people who install your widget.
Taskbars
A taskbar (a widget with kind: "bar", see
building a taskbar) ships through this same
pipeline. Pick Taskbar at the top of the submit page before you
upload: the zip's manifest must declare kind: "bar" with its bar block,
and the choice is checked against the zip, so a mix-up gets a clear error instead of a mislabeled listing.
Taskbars have no store categories. Screenshots show the bar on a desktop
edge, at a size where its icons are readable. Everything else on this page
applies as written, and the published taskbar appears on the
Taskbars shelf and under Taskbars in the app's
marketplace, where installing it offers Use right away.
What validation checks
Upload validation enforces the same manifest rules the app does, strictly. The ones that catch people:
- Unknown manifest fields are errors, not warnings.
versionmust be dotted numbers, like1.2.3.minAppVersion, if you write one, must be a plainx.y.z. You do not need one: see the app version below.- Font files are checked by content, not extension: woff2 only, and every
font file must be declared in
fonts.bundle. settingsholds at most 32 entries; a preset name counts as one.
A failed upload returns the full list of problems; nothing is submitted until the zip is clean.
The app version
You do not pick which DeskDash release your widget needs. The store works it
out from the manifest and stamps it as minAppVersion on every new version:
each permission, setting type, preset and manifest field you use has a
release it last changed in, and so does the SDK itself, and the stamp is the
newest of those. The upload's success screen and your submissions page show
the result ("needs DeskDash 0.3.9 or newer").
A minAppVersion you write yourself only counts when it is higher, for the
rare widget that depends on an app fix. A published version keeps the value
it shipped with. People on an older app see "Needs app update" on your
listing.
Your widget's public identity
This is the part that surprises people, so read it twice: the store
assigns your widget's id. At first publish, the id becomes
yourhandle.widget-name, with the second half derived from the manifest's
name. Whatever id you used locally is replaced, and the author field
is stamped with your handle. Both are outside your control by design; ids
carry the publisher's identity, so no one can squat a name or impersonate
another author.
Two consequences:
- The id is minted once. Renaming the widget in a later update changes its display name everywhere, but never the id.
- If you publish a second widget whose name slugs to the same id, the upload is rejected and asks you to rename or update the existing widget.
The listing
The listing is filled in on the submit form, not shipped in the zip:
- Category, from the store's fixed set.
- Feature points: 1 to 8 short lines, up to 120 characters each. These render as the listing's bullet list; make them concrete ("Connect and disconnect wifi networks", not "Powerful networking").
- Long description: up to 2000 characters, shown below the features.
- Screenshots: 1 to 5, ordered; the first is the cover shown in the store grid.
The listing title and short description always come from the manifest's
name and description, so those two fields are worth polishing before
you zip.
Screenshots
Still PNG, JPEG, or WebP images, up to 4 MB each, checked by content. There is no enforced size or aspect ratio; the practical guidance is the form's own: show the widget as it looks on a desktop, at a size where its text is readable. Each screenshot takes optional alt text (up to 160 characters) for accessibility.
One thing to know before you upload: screenshots become reachable at a public URL as soon as they are staged, which is before review. Do not include anything in a screenshot you would not want public.
Review
Every submission goes through automated checks and then a human review of the actual code. The reviewer reads every file, so the bar is legibility:
- Permissions must be justified by what the widget visibly does. The
smaller the grant list, the faster the review;
httphosts andlinksprefixes get particular attention. - No minified or obfuscated code. Widgets ship as plain source with no build step, and the review depends on that.
- Bundled fonts get a licensing check; include the license and make sure the font actually permits redistribution.
Your submissions page on the website shows each submission's status, and you get an email at each decision:
- In review: waiting for the reviewer.
- Changes requested: the reviewer wants something fixed, and the note on
the page (and in the email) says what. Use Upload a fix there: keep the
same
version, and the fix joins the same review instead of starting a new one. - Live: accepted and published.
- Not accepted: the note says why. Nothing was published, so you may submit again with the same version number.
- Withdrawn: you took it back. Any open submission has a Withdraw button.
- Failed: a pipeline error on the store's side.
One submission per widget can be open (in review or waiting for a fix) at a time.
After acceptance
The version is published and becomes immutable: its exact bytes are what users install, verified against a checksum, and no one, you included, can replace the contents of a published version. Fixes ship as new versions.
Shipping an update
Updates are explicit: on the submit page, choose the widget under "Update an existing widget" and upload the new zip.
- The manifest
versionmust be strictly higher than the published one, and a published version number is never reused. (After a rejection or a withdrawal you may resubmit the same number; nothing was published.) - The listing form prefills from the current listing but is applied wholesale: what the form contains on submit is the whole new listing, so an emptied field disappears from the store page when the update lands.
- The category is fixed on version updates; change it through a listing edit instead.
- If the update adds a permission, users are asked again at install and update time; removed permissions apply silently. Growing the grant list is friction for every existing user, so treat additions deliberately.
Listing-only edits
Screenshots, features, description or category changes without a code change do not need a version bump: your published widgets' pages have an "Edit listing" action that submits just the listing for review, no zip involved.
Unlisting a widget
Your submissions page has an Unlist button on each live widget. An unlisted widget leaves the marketplace for new users: it drops out of browse, search, its web page and the sitemap. Everyone who already installed it keeps it, still gets the updates you publish, and can reinstall it. Relist puts it back with no new review, since its content was reviewed when it shipped. The widget id stays yours either way.
Unlisting never uninstalls copies people have, and deleting your account does not remove your published widgets either. To have a widget removed for everyone, contact support.
Theming and tokens
Style with the --dd-* design tokens so widgets follow every theme, read token values from JavaScript, and react to theme changes at runtime.
Design guidelines
What makes a widget feel native to DeskDash: components first, tokens always, quiet motion, and restraint in density and decoration.