All docs
Docs/ Packages/ Publish to the store
Packages

Publish to the store

Publish a package to the LSD Store: upload code, attach optional content packs, pass review, and ship immutable signed artifacts.

TL;DRPublishing turns a package draft into a reviewed Store listing. The server validates a code-only .lsdpackage and zero or more separate .lsdcontent packs, stores immutable artifacts, and signs their exact authorities. Clients pin the Catalog signing key and reject modified or unsigned bytes.

Publishing takes a package you authored and lists it on the LSD Store so others can find, acquire, and install it. Free and paid builds use the same immutable package/content boundary; paid content inherits its exact parent package licence.

The publishing flow#

  1. Create a publisher account on the web store — this is the publisher namespace your package names in its manifest.
  2. Build the canonical code submission as name-version.lsdpackage. It contains package code and metadata, never an examples or assets sidecar.
  3. Upload a version from Creator Studio. The Store validates the archive and creates that exact coordinate as a draft review candidate.
  4. Attach content if wanted. Upload zero or more .lsdcontent files while the code coordinate remains draft. Each pack is independently named and may be required with the package or optional.
  5. Submit for review. This locks the exact code, content set, offer, and Store presentation. An operator can approve or reject the immutable candidate with feedback; only an approved candidate can become the public version.

Each upload is a new version; clients install only a version they acquired and whose exact digests and signature verify.

Package identity#

A Store package's manifest carries the publishing identity on top of the normal v1 fields:

JSON
{
    "_schema_version": 1,
    "name": "lsd-widgets",
    "version": "1.0.0",
    "publisher": "acme",
    "paid": false,
    "tool": "tool"
}
  • publisher must equal the publisher slug owned by the signed-in account.
  • paid must match the exact offer saved in Creator Studio.
  • name and version must match the upload filename, submission metadata, package header, manifest, and Creator Studio draft.

Optional content packs#

A package version may publish no content at all. When it does, every .lsdcontent pack contains exactly one content/<id>/lsd_content.json, an optional 640x360 preview.png, and data under payload/. Categories are template, sample, or learning. Project entries are complete project templates or tutorials; documentation entries are inert data. Python, bytecode, scripts, executables, links, traversal, and malformed project documents are rejected.

required: true means Hub installs the pack in the same transaction as the package and all of its dependencies. Optional packs can be installed or removed later. After review submission the set is locked; publish a new package version to add, remove, or replace content.

Signing & trust#

Every published package is countersigned. Clients verify the signature against the pinned Store key before loading a package, so a tampered or forged build is rejected. The key document is available at /catalog/v1/signing-key; pin it deliberately rather than trusting a key first seen during an install.

LearnAcquire & install · The Package Manager

APIlsd_package.json · PackageManager

ExamplesA complete package

Frequently asked questions

What does the Store upload?

One canonical code-only name-version.lsdpackage, plus zero or more separate .lsdcontent packs. The server verifies coordinates, Python ABI, digests, data-only content, and publisher ownership before storage.

How does a client know a package is genuine?

Every published package is countersigned. Clients pin the Ed25519 key exposed by /catalog/v1/signing-key before loading it, so a tampered or unsigned build is rejected.

By LSD Team · Last updated Sep 09, 2026 Ask a question View as Markdown
Type to search every doc, guide, and tutorial.
↑↓ navigate openesc close