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
serverApiStringOptional Lua script for server-side RPC handlers
hasServerApiBoolean!Whether this app has a server-side API script configured
dataContainerSpecStringOptional 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.
engineVersionInt!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.