Skip to content
Documentation
On this page

Publish profiles

A service describes which levels it accepts with a PublishProfile file: licenses, resource sources, required fields, size limits. Adding a service means writing a file, not editing the analyzer

A profile is data

A publish profile (PublishProfile) is a model that is serialized like any other root, with its own generation

A level can go to the Steam Workshop, the official server, a community server, the catalog of a store build. Each place answers the same questions in its own way. The answers change over the years, and the code does not

What a profile decides:

FieldMeaning
ProfileKeywhich service this is, repeated in every report
AllowedLicensesthe TypicalLicenseType values the service accepts
AllowedUriTypeshow resources may be fetched. An empty list means any way
AllowUnknownLicense, AllowPermissionInsteadwhether an unknown license or a written permission is enough
RequireResourceMeta, RequireResourceUrl, RequireAttribution, RequireAgeRating, RequireLevelAuthors, RequireHasheswhat must be filled in
MaxResourceBytes, MaxDataFileBytes, MaxTotalBytessize limits, 0 means no limit
Sources, UnknownSourceTrusta list of sites and the rating for a site that is not on it

Only the profile decides which licenses are acceptable. It looks like a property of the license, but in fact it is a property of the receiving service

Four built-in profiles

FactoryProfileKeyWhat for
CreateOpen()locala level on your device. Nothing is required
CreateStandard()standarda public server
CreateWorkshop()workshopthe Steam Workshop. Any CC BY variant passes, missing documents only warn
CreateStrict()stricta store build, stricter than standard
Whatstandardstrict
licensesCC0 1.0, CC BY 4.0 and 3.0, CC BY-NC 4.0 and 3.0, SIL OFL 1.1, MIT, Apache 2.0, the Unlicenseas in standard
where resources come fromfrom the level folder, from the game or by a direct linkno links
attribution and hashes-required
limit per resource64 MiB32 MiB
limit per data file32 MiB16 MiB
limit per level256 MiB128 MiB
Recommendation

Do not add a factory for your service. Take one of the four profiles, change the fields you need and ship it as a JSON file

Why these licenses and sizes

  • GPL-family licenses are excluded from standard. A GPL work distributed through the App Store conflicts with Apple's terms
  • CC BY-SA is excluded: ShareAlike would force a change of the license of the level itself
  • CC BY-ND is excluded: NoDerivatives forbids the editing the game is built on
  • the strict sizes are what a phone can download over a mobile network

Where a resource came from

The license field says what the author claims. SourceTrust says what that claim is worth, given the site the resource came from:

RatingOutcomeExamples
ApprovedpublishKenney, ccMixter, Incompetech
PartiallyApprovedpublish, the record is worth a lookPixabay, SoundImage
RequiresLicenseCheckcheck the license against the real pageOpenGameArt, Free Music Archive, Wikimedia Commons
RequiresResourceCheckidentify the work itself firstRawpixel, itch.io
NotAllowedrefuseYouTube, SoundCloud, Spotify
Unknownno record, UnknownSourceTrust decides-

TrustedSourceCatalog.CreateDefault() returns 25 sites. This is a starting list. Every operator is expected to change it. So nothing is entitled to rely on a record being there

An empty Sources list turns source rating off

Streaming platforms are listed as NotAllowed rather than left out. A missing site is rated through UnknownSourceTrust, and in standard and strict that rating asks for a check rather than refusing

The catalog and Licensing policy for user levels describe the same thing and are edited together

What to do with the answer

The call is ValidationFacade.ValidateForPublish. More - Validation

PublishReadinessReport has:

  • HasErrors - findings in the Error group
  • NeedsManualReview - findings in the Warning group
  • IsReady

The profile does not decide what happens next. The client blocks the upload on errors. The server puts the level in a review queue instead of publishing it

The same check from the author's side - Readiness to publish