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.

115Stable Candidate
103Beta
2140Experimental

2358 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
TilemapBetatwo games certify it and one of them runs on every change, which is broader evidence than several rows already at this tier; what is not settled is the multi-tileset layer, whose singular field is still carried for older scenes
ParticlesBetaone certified game drives it, the same evidence spine and scene were published on; the authored curves are the young half — they override the start/end pairs, and only one game has authored any
World residency — streaming a world by cellsExperimentalone shape of world proven end to end: a square XZ grid cut at cook time, loaded synchronously. What a game asks for is settled; what a big one needs after it — priority, budget, a level of detail for what is absent — is not
VideoExperimentalthe platform paths differ enough that the surface is still converging
Gameplay — third-person character and cameraExperimentalthe newest layer in the engine, and the one a game shapes hardest: what a character owes its animator settled first, everything above it has not
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
Script graphs — visual logicExperimentalthe node vocabulary is still growing: a name that gains an output changes what an authored graph can read, so the shape is not one to freeze yet
Networking & replicationExperimentalas AI — the high-level layer waits on the layers under it
Materials, lighting, post-processingExperimentalas AI — a game is built OUT of the layers under this one and they freeze first; the render graph it was waiting on has settled
3D physicsExperimentalits door — the plugin, the world resource, the contact events — reached no entry until this release, so nothing has yet built on the half a game actually calls
3D models & skinningExperimentalthe import chain is certified end to end, but the runtime surface a game drives a model through — geometry, materials per submesh, joint entities — has not been read for a tier
DecalsExperimentalthe cut is proven and nothing authors one yet — the shape will follow what a projector panel turns out to need
Baked lightingExperimentalthe bake runs and nothing in the editor triggers one yet, so the shape of this will follow what an authoring panel turns out to need
DragonBonesExperimentalthe second 2D skeletal runtime, and the one no certified game animates with — Spine carries that evidence and this shares none of it
MathExperimentalthe TYPES are frozen — Vec2, Vec3, Quat are @public and a Transform is made of them — but the operations over them are not, and a verdict has to name the weaker half
LocalizationExperimentalcertified end to end by one game, whose use is a locale and a key lookup; the plural, formatting and fallback surface around that has no consumer
Platform servicesExperimentaleach service is a contract with a store rather than with the engine, and the ones behind it differ enough that the shared shape is still being found

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
SpriteDrawModeenum
SpriteMaskInteractionenum
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
AnimatorDatainterface
Assetsconst
AssetsDatatype
Audioconst
Cameraconst
CameraCommitconst
CameraCommitDatainterface
CameraCommitListenertype
CameraDatainterface
CameraFieldsinterface
CameraLensinterface
CameraTransformFieldsinterface
CharacterController2Dconst
CharacterController2DDatainterface
ClearFlagsenum
EmitterShapeenum
FillMethodenum
FillOriginenum
GraphNodeTypetype
GraphTypetype
Inputconst
InputStateclass
InstantiatePrefabResultinterface
LiveBindingsconst
LiveBindingsDatainterface
MaterialGraphinterface
MaterialGraphNodeinterface
NODE_SPECSconst
NativeBridgeinterface
NativeFetchResultinterface
NativeInputListenerinterface
NativePlatformAdapterclass
NodeParamSpecinterface
NodePortinterface
NodeSpecinterface
OccluderDatainterface
ParticleEasingenum
ParticleEmitterconst
ParticleEmitterDatainterface
Physics2Dconst
Physics2DEventsconst
Physics2DEventsDatainterface
PrefabOverrideinterface
PrefabServerclass
Prefabsconst
PresentedCameraViewconst
ProjectionTypeenum
ReflectionProbeDatainterface
SceneConfiginterface
SceneContextinterface
SceneLoadProgressCallbacktype
SceneManagerconst
SceneManagerStateclass
SceneStatustype
SimulationSpaceenum
SortingGroupDatainterface
SpawnOverridetype
Spineconst
SpineAnimationconst
SpineAnimationDatainterface
SpriteAnimatorconst
SpriteAnimatorDatainterface
SpriteMaskDatainterface
SubEmitterTriggerenum
ThemeColorsinterface
TilemapLayerconst
TilemapLayerDatainterface
TilemapOrientationenum
TilemapStaggerAxisenum
TilemapStaggerIndexenum
TouchPointinterface
TransitionConfiginterface
TransitionOptionsinterface
UICameraDatainterface
UICameraInfoconst
UINodeconst
UIVisualconst
UIVisualDatainterface
UIVisualFitenum
UIVisualTypeenum
acquireWebGPUDevicefunction
addNodefunction
cameraCommitChangedfunction
cameraFrustumCornersfunction
captureFramePixelsfunction
compileMaterialGraphfunction
connectfunction
createHeadlessAppfunction
disconnectfunction
exactconst
installNativePlatformfunction
loadEsengineModulefunction
moveNodefunction
newMaterialGraphfunction
nodeAdapterconst
onCameraCommitChangedfunction
presentedCameraViewconst
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.