← API reference
CANONICAL TYPE REFERENCE

CustomAppState

A custom app with embedded Vue components

Unique identifier

nameString!

Human-readable name

handleString!

Unique URL-safe slug

iconString!

Icon identifier (defaults to 'app_badging')

App kind determining display location

templateString!

Vue template HTML to render in the iframe

scriptString!

JavaScript/TypeScript script to execute client-side

serverApiString

Optional Lua script for server-side RPC handlers

hasServerApiBoolean!

Whether this app has a server-side API script configured

Optional JSON schema for custom data container validation

The version number published to end users (nil = draft only)

TypeID of the version the app currently serves (prefix cav); null when nothing is published. Same fact as publishedVersion, as a reference — a version number is assigned by the server, so only the id can be pointed at by configuration written before the version exists.

useDaisyUIBoolean!

Include bundled DaisyUI styles with host theme colours. Optional for engine 3; legacy engines always include their existing styles.

Custom-app engine version: 1 = legacy, 2 = split Vue + Lua exports, 3 = App.vue SFC + Lua exports. New apps default to 3.

createdAtString!

Creation timestamp (ISO8601)

updatedAtString!

Last update timestamp (ISO8601)

View exact SDL
"""A custom app with embedded Vue components"""
type CustomAppState @iac_resource(name: "custom_app") @iac_guide(ref: "custom-app-guide") @iac_ops(create: "createCustomApp", read: "getCustomApp", update: "updateCustomApp", delete: "deleteCustomApp") @iac_replace(strategy: DESTROY_BEFORE_CREATE) {
  """Unique identifier"""
  id: CustomAppID! @iac_identity(assignedBy: SERVER) @iac_computed
  """Human-readable name"""
  name: String!
  """Unique URL-safe slug"""
  handle: String! @iac_forcesReplace
  """Icon identifier (defaults to 'app_badging')"""
  icon: String!
  """App kind determining display location"""
  kind: CustomAppKind!
  """Vue template HTML to render in the iframe"""
  template: String! @iac_computed
  """JavaScript/TypeScript script to execute client-side"""
  script: String! @iac_computed
  """Optional Lua script for server-side RPC handlers"""
  serverApi: String @iac_computed
  """Whether this app has a server-side API script configured"""
  hasServerApi: Boolean! @iac_computed
  """Optional JSON schema for custom data container validation"""
  dataContainerSpec: String @iac_validate(with: ["custom-app-content"])
  """The version number published to end users (nil = draft only)"""
  publishedVersion: Int @iac_computed
  """
  TypeID of the version the app currently serves (prefix `cav`); null when nothing is published. Same fact as `publishedVersion`, as a reference — a version number is assigned by the server, so only the id can be pointed at by configuration written before the version exists.
  """
  publishedVersionId: CustomAppVersionID @iac_ref(resource: "custom_app_version") @iac_writtenBy(operation: "publishCustomApp", argument: "versionId")
  """
  Include bundled DaisyUI styles with host theme colours. Optional for engine 3; legacy engines always include their existing styles.
  """
  useDaisyUI: Boolean! @iac_computed
  """
  Custom-app engine version: 1 = legacy, 2 = split Vue + Lua exports, 3 = App.vue SFC + Lua exports. New apps default to 3.
  """
  engineVersion: Int! @iac_computed
  """Creation timestamp (ISO8601)"""
  createdAt: String! @iac_computed
  """Last update timestamp (ISO8601)"""
  updatedAt: String! @iac_computed
}

One stable address across all schema views. Follow a field’s type to explore connections between domains.