casset/docs
FeaturesOpen app
docs indexreference
00Overview01Thesis02Architecture03Casset Apps04System reality05Roadmap06Investor brief07Technical brief08Full tech HTML09API reference10Playback11Audio pipeline12Commerce13Base anchoring14Hook system15Music video16Theming17Creator guide18Glossary
LearnQuickstartApp modelSDKStartersReferenceDistribution

Casset Apps · Reference

The bounded contract, field by field.

Use this page when validating a manifest, handling a host state, or diagnosing why a local fixture behaves differently from production authorization.

Manifest

Public fields only

Casset App manifest fields
FieldPurposeConstraint
schemaContract version.Exactly casset.app-manifest.v1.
id / slug / nameStable developer identity and listener-facing title.No internal registry or runtime key.
shortDescription / descriptionReview and Store copy.Bounded non-empty text; do not invent capabilities.
developerDeveloper name and optional HTTPS URL.No credential or account authority.
icon / screenshotsPublic presentation assets.Relative, HTTPS, or data-image references only; up to six screenshots.
categoryIDENTITY, RELEASE, COMMUNITY, or CREATIVE.Editorial classification only.
contextPROFILE_SURFACE or TRACK_RUNTIME.No stored runtime dispatcher key.
placementsMEDIA_FOOTER and/or ARTIST_APP_ROUTE.Requested presentation, not route ownership.
permissionsSmallest declared capability set.playback.control requires playback.read and is Profile-only.
supportedFanAccessFREE and optionally CASSET_PURCHASE.Casset owns entitlement evaluation and checkout.
compatibilitymobile, desktop, and PWA declarations.Descriptive until reviewed.
trackApplicabilityAllowed ORIGINAL/GENERATION Track families.Required for Track Runtime; null for Profile Surface.

Permissions

Declare intent; handle denial.

Casset App permissions
PermissionPurposeCurrent projectionConstraint
artist.profile.readBounded artist identity.Profile and Track contexts.Required for every current context.
artist.theme.readSafe atmosphere/theme projection.Profile data state; optional Track theme.Never raw Artist.themeJson.
catalog.tracks.readApproved Track identity and artwork projection.Profile Catalog and exact Track Runtime target.No audio URL or token.
catalog.releases.readApproved release projection.Profile active release; Track release where present.No private campaign operations.
media.moments.readDeclared Moment-read intent.No public Profile adapter in this alpha.Profile moments remains unavailable.
playback.readSanitized canonical playback observation.Required by Track Runtime and before playback.control.No player object or mutable clock.
playback.controlRequest host-approved Profile playback.PLAY_TRACK only with PROFILE_PLAY_TRACK.Unsupported in Track Runtime.
campaigns.readDeclared Campaign-read intent.No public Profile adapter in this alpha.Profile campaigns remains unavailable.
audience.aggregate.readDeclared aggregate Audience intent.No public Profile adapter in this alpha.No identities or private audience rows.

Server authorization remains authoritative

A manifest request, client permission check, fixture, visible launcher, or accepted local host command never grants production access. Disabled, removed, private-inaccessible, suspended, mismatched, or unentitled launches fail before protected context is created.

Commands

Two request shapes, one host decision.

Casset host commands
CommandContextRequirementsResult
APP_EXITProfile or TrackAPP_EXIT capability and an open host.ACCEPTED closes the host; otherwise a bounded DENIED reason.
PLAY_TRACKProfile onlyplayback.control, PROFILE_PLAY_TRACK, and a Track ID in the ready host Catalog.Casset accepts or denies; the App never starts playback itself.
Correct Profile playback requestts
const snapshot = host.getSnapshot()
if (
  snapshot.context.kind === "PROFILE_SURFACE" &&
  isCassetDataReady(snapshot.context.catalog) &&
  hasCassetPermission(snapshot.context, "playback.control") &&
  hostSupports(snapshot, "PROFILE_PLAY_TRACK") &&
  snapshot.context.catalog.data.tracks.some((track) => track.id === trackId)
) {
  const decision = await host.request({ type: "PLAY_TRACK", trackId })
}

Command decisions

Denied requests are expected states.

Casset host command denial reasons
ReasonMeaning
HOST_CLOSEDThe App context ended; release local state.
UNSUPPORTED_CAPABILITYThe current host does not implement that request.
WRONG_CONTEXTPLAY_TRACK was sent from Track Runtime.
PERMISSION_DENIEDplayback.control was not granted.
UNKNOWN_TRACKThe requested Track is absent from the ready host Catalog.
INVALID_REQUESTThe untrusted command failed strict validation.

Local QA

Test every state the host can expose.

Data states

Loading, ready, empty, permission-denied, HOST_UNAVAILABLE, NOT_IMPLEMENTED, and NOT_APPLICABLE.

Lifecycle

CONTEXT_READY, ACTIVE, CLOSED, unsubscribe on deactivation, and safe reactivation with a new snapshot.

Playback requests

Accepted, denied, missing permission, unsupported capability, wrong context, and unknown Track.

Responsive access

320×568, 390×844, desktop, keyboard-only, 200% text, reduced motion, and missing artwork.

Installation truth

Document that local enable/disable controls are fixtures only; production disablement and removal are server enforced.

Runtime determinism

Pause, forward seek, backward seek, Track change, completion, deactivation, and no local time source.
Permission-denied fixturets
const context = createProfileSurfaceFixture({
  permissions: ["artist.profile.read"],
  catalog: {
    status: "permission-denied",
    permission: "catalog.tracks.read",
  },
})

host.setSnapshot(createCassetHostSnapshotFixture(context))

Troubleshooting

Common failures have bounded fixes.

Casset App troubleshooting
SymptomLikely causeAction
@casset/apps cannot be resolvedThe project is outside the repository and lacks the vendored SDK.Use a generated ZIP and keep file:./vendor/casset-apps-sdk; do not install from npm.
Manifest parser reports FIELD_UNKNOWNAn internal or invented field was added.Remove runtime keys, routes, approval state, executable entries, or unsupported metadata.
PLAY_TRACK returns UNSUPPORTED_CAPABILITYPROFILE_PLAY_TRACK is absent.Keep the control unavailable and preserve the host-owned player.
PLAY_TRACK returns UNKNOWN_TRACKThe ID did not come from the ready bounded Catalog.Request only a visible context Track ID.
Track visual drifts after seekThe App created local time or accumulated animation state.Recompute directly from canonical currentTimeSec/progress on every snapshot.
Moments, Campaigns, or Audience never becomes readyThose Profile adapters are not implemented.Keep the unavailable state; do not fetch internal routes.
Local App works but production route is absentLocal fixtures do not install or approve an App.See Distribution status; open third-party admission is unavailable.

FAQ

Short answers to platform questions

  • Can I publish this App? No. The SDK and starters are usable locally; third-party submission and arbitrary production bundles are unavailable.
  • Can I call Casset's private APIs? No. Apps consume the supplied host context and request channel.
  • Can I control playback from Track Runtime? No. Track Runtime is read-only in this alpha.
  • Can I use an artwork URL? Only the bounded public artwork fields supplied by the host. Audio URLs and tokens never enter the SDK contract.
  • What happens after disable or uninstall? New server-authorized routes and contexts fail closed; local fixtures cannot override that truth.

Need the operational boundary?

The Distribution page distinguishes repository-local development, trusted internal installation, the internal Simulator, and capabilities that remain unavailable.
© Casset 2026
Trust & PrivacyTerms