umbraco-marketplace
Gets a finished package listed on the Umbraco Marketplace: the NuGet tag, the dependency Marketplace reads version support from, the v14+ compatibility gotcha, and umbraco-marketplace.json. Use when a
SKILL.mdplugins/umbraco-devkit/skills/umbraco-marketplace/SKILL.md
GitHubumbraco-marketplace
Getting listed is almost entirely automatic — there's no submission form, no review queue, no code-quality or security gate, and no revenue share. The whole mechanism is a NuGet tag plus a dependency reference. Most packages that "aren't showing up" just have one of those wrong.
How listing actually works
Marketplace syncs from NuGet, not from a submission: new packages are picked up daily, listing metadata refreshes every couple of hours, and there's a self-serve validator (marketplace.umbraco.com/validate) to check your metadata before or after publishing. There is no human review step and no stated code-quality, security, or "actively maintained" bar — see "What this skips, and why" below for what that means for this skill's scope.
What actually gets you listed
- The
umbraco-marketplaceNuGet tag. Add it to the package's<PackageTags>— and only to the top-level, installable package. Don't tag an internal.Core-style dependency package that isn't meant to be installed directly; that just duplicates the listing. - A dependency on an Umbraco package. Marketplace infers which CMS major version(s) your
package supports from the version range of your
Umbraco.Cms.*(orUmbracoCms.*for a v8 package,Umbraco.Commerce.*for a Commerce extension) package reference. If that reference is missing or wrong, the version compatibility shown on the listing will be wrong too. - Standard NuGet metadata, same fields as any NuGet package, pulled straight into the
listing:
PackageId(community convention:Umbraco.Community.<PackageName>for an unofficial package),Authors,Description,PackageIcon,PackageReadmeFile,PackageProjectUrl,PackageLicenseExpression(a real SPDX id — MIT is the common default, same asgithub-init's recommendation),Tags.
The version-compatibility gotcha
Umbraco 14 rewrote the backoffice. Because of that, Marketplace doesn't trust an open-ended
range across that line: a dependency with a minimum of v13 or lower and no maximum (say
Umbraco.Cms.Core 10.0.0) is listed as not supporting v14+, even if the code works there.
That's right for anything with backoffice UI. For a package with no UI that really does work
on v14+, there are two fixes:
- Set
VersionDependencyMode: SemVerin the optionalumbraco-marketplace.jsondescribed below. Marketplace then takes the NuGet range as written, open maximum included. This fixes the listing without a new release. - Or release a version whose range doesn't cross the line that way: a minimum of v14, or an
explicit maximum (
[10.0.0, 18.0.0)).
A range that already stops below v14 ([10.0.0, 14.0.0)) means what it says; neither fix
applies until the range itself changes.
Optional: umbraco-marketplace.json — richer listing metadata
Hosted at your PackageProjectUrl (or umbraco-marketplace-{package-id}.json if one repo or
site hosts more than one package). Lets you set things NuGet metadata alone can't express:
title, a longer description, a category (Marketplace uses a fixed list — check the current
one on the docs page below rather than assuming it hasn't changed), a license type (Free /
Purchase / Subscription — a display label, not a billing integration; Marketplace doesn't take
a cut), package type, documentation/issue-tracker/discussion links, screenshots, video links,
author/contributor details, related packages, and the VersionDependencyMode override above.
A sibling umbraco-marketplace-readme.md file can override the listing's README independent
of the one NuGet ships.
Field names and the category list change over time — confirm the current shape against
the docs (umbraco-docs) before hand-writing this file rather than copying an example verbatim.
Behavior — before you tag a release
- Confirm the package's
.csproj/.nuspechas the tag, the Umbraco dependency, and the standard metadata fields above. Don't invent values — pull description/icon/license from what the project already declares (README.md,LICENSE,CLAUDE.md's stated CMS version(s)), the same disciplinegithub-inituses for its README gate. - If the package works on Umbraco 14+ but its range is open-ended from v13 or lower, apply one of the two fixes in "The version-compatibility gotcha".
- If richer listing metadata is wanted (screenshots, category, docs links), draft
umbraco-marketplace.json— confirm the current field names/category list against the docs first. - After publishing to NuGet, run the package through marketplace.umbraco.com/validate before considering this done.
What this skips, and why
- No code-quality, security, or "actively maintained" gate. Umbraco doesn't enforce one at
listing time, so this skill doesn't invent one — that's
umbraco-securityand therevieweragent's job, already covered elsewhere in this plugin. - No release pipeline. Tagging a version and running
dotnet pack/dotnet nuget pushis a "build on top" concern, same as the README's own stated scope forgit-workflow— this skill covers what makes a published package listable, not how you automate the publish step itself. - License type is a label, not a payment system. Setting
Purchase/Subscriptioninumbraco-marketplace.jsondoesn't wire up billing; if the package needs real payment handling, that's a separate, project-specific concern this skill doesn't cover.
Sources
- https://docs.umbraco.com/umbraco-dxp/marketplace/listing-your-package
- https://docs.umbraco.com/umbraco-dxp/marketplace/introduction
- https://docs.umbraco.com/umbraco-cms/extend-your-project/packages/creating-a-package
- https://umbraco.com/blog/get-ready-for-the-new-umbraco-marketplace
Hand off
Report which of the required items were already in place, which were added, and whether
umbraco-marketplace.json was created/updated and why. If any field's current shape couldn't
be confirmed against live docs, say so rather than guessing.