Skip to content

API stability

Estella is pre-1.0, and not all of its API is equally settled. Rather than ask you to guess which parts are, every exported symbol carries exactly one stability tier as a JSDoc tag on its declaration — so it ships in the .d.ts your project compiles against, and your editor shows it when you hover.

Tier Tag What it promises
Stable Candidate @public We expect 1.0 not to break it. Removing or changing one takes a deprecation release first.
Beta @beta Shipping and supported; the shape may still adjust before 1.0.
Experimental @experimental No compatibility claim. It may change or disappear in any release.
Internal @internal Not for you to depend on. It is a build error for one to be exported at all.

There is no stable-by-default. An untagged symbol is Experimental, so freezing an API is something we decide, never something we forget to prevent.

A symbol only reaches Stable Candidate once three things are true: it is documented, a test pins its behaviour, and one of the games we certify releases against actually calls it. That bar is a build gate, not a habit — and so is the promise itself, which is compared against the previous release tag on every push.

The full list below is generated from the same snapshots the guards read.

113Stable Candidate
73Beta
1562Experimental

1748 exported symbols in total. Experimental is the default: a symbol reaches a stronger tier only when someone decides it has, so this page grows one deliberate step at a time.

By subsystem

The same answer at the size you build in. Every verdict here is held against the tags its entry symbols carry, so this table cannot quietly disagree with them.

SubsystemTierWhy
ECSStable CandidateFrozen — the bar it had to clear is below.
App lifecycleStable CandidateFrozen — the bar it had to clear is below.
Transform & hierarchyStable CandidateFrozen — the bar it had to clear is below.
Sprites & textStable CandidateFrozen — the bar it had to clear is below.
Input actionsStable Candidatethe action and binding vocabulary is frozen; the raw per-frame state under it is Beta — see InputState
Layout unitsStable CandidateFrozen — the bar it had to clear is below.
Raw input stateBetaper-frame touch state is reachable only as raw collections, with no accessor for started/ended and no write door — freezing it would freeze both gaps
UIBetathirty-three of a hundred and fifteen UI symbols reach a certified game, and the newest part of the surface is the part a creator meets first — anchors, insets, theme tokens
ScenesBetaone certified project drives scenes at all, against twenty-six SceneManagerState signatures
PrefabsBetainstantiate has not moved, but its result and override shapes are the on-disk format's, so the names settled ahead of the shapes
AssetsBetaone certified project takes Res(Assets), for four of its members, and the host wiring — resolvers, registries, the manifest, device-loss recovery — has to leave the game-facing surface first
PhysicsBetathe corpus reaches three of thirty-seven physics symbols
CameraBetaclearFlags is a bitmask whose C++ enum has no TypeScript spelling, and cullingMask names layers no exported constant identifies — two fields typed `number` for want of the vocabulary
SpineBetaone certified project plays a skeleton; the runtime is a side module a project opts into
AudioBetaa certified run drives a loop and reads the master bus analyser, so a break is noticed — but the corpus reaches a handful of twenty-three audio symbols
Animation & timelineBetasprite-animation now certifies it end to end, but the corpus reaches two of eighty animation symbols and the timeline half of them is untouched
TilemapExperimentalcertified end to end by two games, but the runtime surface has not been read for a tier yet
ParticlesExperimentalas tilemap — exercised by a certified game, not yet read for a tier
VideoExperimentalthe platform paths differ enough that the surface is still converging
AI — navigation, FSM, behaviour treesExperimentaldeliberately after the rest: 0.50 freezes what a game is built OUT of, and the layers built ON that come once those are settled
Networking & replicationExperimentalas AI — the high-level layer waits on the layers under it
Materials, lighting, post-processingExperimentalas AI — and the render graph behind it is still moving

Stable Candidate

We expect 1.0 not to break these. Each one is documented, pinned by a test, and used by a game we certify releases against; changing or removing one takes a deprecation release first.

SymbolKind
ActionDefinterface
ActionTypetype
AddedWrapperinterface
AnyComponentDeftype
AssetFieldMetainterface
AssetFieldTypetype
AssetRefinterface
Axis1Dconst
Axis2Dconst
Bindingtype
BuiltinComponentDefinterface
Buttonconst
ChangedWrapperinterface
Childrenconst
ChildrenDatainterface
Colorinterface
Commandsfunction
CommandsDescriptorinterface
CommandsInstanceclass
ComponentDatatype
ComponentDefinterface
ComponentMetadatainterface
ComponentsDatatype
Dimensioninterface
DimensionUnittype
Entitytype
EntityCommandsclass
EventDefinterface
EventReaderfunction
EventReaderDescriptorinterface
EventReaderInstanceclass
EventWriterfunction
EventWriterDescriptorinterface
EventWriterInstanceclass
FieldMetainterface
FilterExprtype
GamepadAxisenum
GamepadButtonenum
GetWorldfunction
GetWorldDescriptorinterface
GpAxisconst
GpButtonconst
InferParamtype
InferParamstype
InputMapclass
InputMapAssetinterface
Keyconst
Keys1Dconst
Keys2Dconst
ListenOptionsinterface
MouseButtonconst
Mutfunction
MutWrapperinterface
Nameconst
NameDatainterface
Parentconst
ParentDatainterface
Quatinterface
Queryfunction
QueryArgtype
QueryBuilderinterface
QueryDescriptorinterface
QueryInstanceclass
QueryResulttype
RemovedQueryDescriptorinterface
RemovedQueryInstanceclass
Resfunction
ResDescriptorinterface
ResMutfunction
ResMutDescriptorinterface
ResMutInstanceclass
ResourceDefinterface
RunConditiontype
RuntimeOnlyconst
Scheduleenum
SkeletalFieldMetainterface
Spriteconst
SpriteDatainterface
Stickconst
SystemDefinterface
SystemOptionsinterface
SystemParamtype
SystemSetinterface
SystemSetOptionsinterface
SystemTouchesinterface
Textconst
TextAligntype
TextDatainterface
TextOverflowtype
TextRenderModetype
TextVerticalAligntype
Timeconst
TimeDatainterface
Transformconst
TransformDatainterface
UnwrapQueryArgtype
Vec2interface
Vec3interface
Vec4interface
Virtualconst
Worldclass
addStartupSystemfunction
addSystemSetToSchedulefunction
addSystemToSchedulefunction
defineComponentfunction
defineEventfunction
defineInputMapfunction
defineResourcefunction
defineSystemfunction
defineSystemSetfunction
defineTagfunction
percentconst
pxconst

Beta

Shipping and supported, but the shape may still adjust before 1.0. Build on them; expect to read the changelog.

SymbolKind
Animatorconst
Assetsconst
AssetsDatatype
Audioconst
Cameraconst
CameraDatainterface
CameraFieldsinterface
CameraTransformFieldsinterface
CharacterControllerconst
CharacterController3Dconst
ConvexCollider3Dconst
DistanceJoint3Dconst
FixedJoint3Dconst
GraphNodeTypetype
GraphTypetype
HingeJoint3Dconst
Inputconst
InputStateclass
InstantiatePrefabResultinterface
MaterialGraphinterface
MaterialGraphNodeinterface
MeshCollider3Dconst
NODE_SPECSconst
NativeBridgeinterface
NativeFetchResultinterface
NativeInputListenerinterface
NativePlatformAdapterclass
NodeParamSpecinterface
NodePortinterface
NodeSpecinterface
Physicsconst
PhysicsEventsconst
PointJoint3Dconst
PrefabOverrideinterface
PrefabServerclass
Prefabsconst
SceneConfiginterface
SceneContextinterface
SceneLoadProgressCallbacktype
SceneManagerconst
SceneManagerStateclass
SceneStatustype
SliderJoint3Dconst
SpawnOverridetype
Spineconst
SpineAnimationconst
SpriteAnimatorconst
ThemeColorsinterface
TouchPointinterface
TransitionConfiginterface
TransitionOptionsinterface
UICameraDatainterface
UICameraInfoconst
UINodeconst
UIVisualconst
acquireWebGPUDevicefunction
addNodefunction
cameraFrustumCornersfunction
captureFramePixelsfunction
compileMaterialGraphfunction
connectfunction
createHeadlessAppfunction
disconnectfunction
installNativePlatformfunction
loadEsengineModulefunction
moveNodefunction
newMaterialGraphfunction
nodeAdapterconst
removeNodefunction
runHeadlessfunction
spawnUIEntityfunction
themeColorsfunction
transitionTofunction

Experimental

Everything else, which is most of the surface. It works and it is what the editor itself is built on, but no compatibility claim is attached: it may change or disappear in any release. Your editor shows the tier on hover, and sdk/etc/*.api.md in the repository is the full inventory.

The tiers above describe the TypeScript API. Estella’s 1.0 promise also covers the project and asset formats, the WASM runtime contract, and the documented build CLI — see Versioning Policy for what a breaking change means for each.