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.
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.
| Subsystem | Tier | Why |
|---|---|---|
| ECS | Stable Candidate | Frozen — the bar it had to clear is below. |
| App lifecycle | Stable Candidate | Frozen — the bar it had to clear is below. |
| Transform & hierarchy | Stable Candidate | Frozen — the bar it had to clear is below. |
| Sprites & text | Stable Candidate | Frozen — the bar it had to clear is below. |
| Input actions | Stable Candidate | the action and binding vocabulary is frozen; the raw per-frame state under it is Beta — see InputState |
| Layout units | Stable Candidate | Frozen — the bar it had to clear is below. |
| Raw input state | Beta | per-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 |
| UI | Beta | thirty-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 |
| Scenes | Beta | one certified project drives scenes at all, against twenty-six SceneManagerState signatures |
| Prefabs | Beta | instantiate has not moved, but its result and override shapes are the on-disk format's, so the names settled ahead of the shapes |
| Assets | Beta | one 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 |
| Physics | Beta | the corpus reaches three of thirty-seven physics symbols |
| Camera | Beta | clearFlags 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 |
| Spine | Beta | one certified project plays a skeleton; the runtime is a side module a project opts into |
| Audio | Beta | a 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 & timeline | Beta | sprite-animation now certifies it end to end, but the corpus reaches two of eighty animation symbols and the timeline half of them is untouched |
| Tilemap | Beta | two 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 |
| Particles | Beta | one 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 cells | Experimental | one 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 |
| Video | Experimental | the platform paths differ enough that the surface is still converging |
| Gameplay — third-person character and camera | Experimental | the 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 trees | Experimental | deliberately 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 logic | Experimental | the 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 & replication | Experimental | as AI — the high-level layer waits on the layers under it |
| Materials, lighting, post-processing | Experimental | as 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 physics | Experimental | its 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 & skinning | Experimental | the 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 |
| Decals | Experimental | the cut is proven and nothing authors one yet — the shape will follow what a projector panel turns out to need |
| Baked lighting | Experimental | the 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 |
| DragonBones | Experimental | the second 2D skeletal runtime, and the one no certified game animates with — Spine carries that evidence and this shares none of it |
| Math | Experimental | the 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 |
| Localization | Experimental | certified 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 services | Experimental | each 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.
| Symbol | Kind |
|---|---|
ActionDef | interface |
ActionType | type |
AddedWrapper | interface |
AnyComponentDef | type |
AssetFieldMeta | interface |
AssetFieldType | type |
AssetRef | interface |
Axis1D | const |
Axis2D | const |
Binding | type |
BuiltinComponentDef | interface |
Button | const |
ChangedWrapper | interface |
Children | const |
ChildrenData | interface |
Color | interface |
Commands | function |
CommandsDescriptor | interface |
CommandsInstance | class |
ComponentData | type |
ComponentDef | interface |
ComponentMetadata | interface |
ComponentsData | type |
Dimension | interface |
DimensionUnit | type |
Entity | type |
EntityCommands | class |
EventDef | interface |
EventReader | function |
EventReaderDescriptor | interface |
EventReaderInstance | class |
EventWriter | function |
EventWriterDescriptor | interface |
EventWriterInstance | class |
FieldMeta | interface |
FilterExpr | type |
GamepadAxis | enum |
GamepadButton | enum |
GetWorld | function |
GetWorldDescriptor | interface |
GpAxis | const |
GpButton | const |
InferParam | type |
InferParams | type |
InputMap | class |
InputMapAsset | interface |
Key | const |
Keys1D | const |
Keys2D | const |
ListenOptions | interface |
MouseButton | const |
Mut | function |
MutWrapper | interface |
Name | const |
NameData | interface |
Parent | const |
ParentData | interface |
Quat | interface |
Query | function |
QueryArg | type |
QueryBuilder | interface |
QueryDescriptor | interface |
QueryInstance | class |
QueryResult | type |
RemovedQueryDescriptor | interface |
RemovedQueryInstance | class |
Res | function |
ResDescriptor | interface |
ResMut | function |
ResMutDescriptor | interface |
ResMutInstance | class |
ResourceDef | interface |
RunCondition | type |
RuntimeOnly | const |
Schedule | enum |
SkeletalFieldMeta | interface |
Sprite | const |
SpriteData | interface |
SpriteDrawMode | enum |
SpriteMaskInteraction | enum |
Stick | const |
SystemDef | interface |
SystemOptions | interface |
SystemParam | type |
SystemSet | interface |
SystemSetOptions | interface |
SystemTouches | interface |
Text | const |
TextAlign | type |
TextData | interface |
TextOverflow | type |
TextRenderMode | type |
TextVerticalAlign | type |
Time | const |
TimeData | interface |
Transform | const |
TransformData | interface |
UnwrapQueryArg | type |
Vec2 | interface |
Vec3 | interface |
Vec4 | interface |
Virtual | const |
World | class |
addStartupSystem | function |
addSystemSetToSchedule | function |
addSystemToSchedule | function |
defineComponent | function |
defineEvent | function |
defineInputMap | function |
defineResource | function |
defineSystem | function |
defineSystemSet | function |
defineTag | function |
percent | const |
px | const |
Beta
Shipping and supported, but the shape may still adjust before 1.0. Build on them; expect to read the changelog.
| Symbol | Kind |
|---|---|
Animator | const |
AnimatorData | interface |
Assets | const |
AssetsData | type |
Audio | const |
Camera | const |
CameraCommit | const |
CameraCommitData | interface |
CameraCommitListener | type |
CameraData | interface |
CameraFields | interface |
CameraLens | interface |
CameraTransformFields | interface |
CharacterController2D | const |
CharacterController2DData | interface |
ClearFlags | enum |
EmitterShape | enum |
FillMethod | enum |
FillOrigin | enum |
GraphNodeType | type |
GraphType | type |
Input | const |
InputState | class |
InstantiatePrefabResult | interface |
LiveBindings | const |
LiveBindingsData | interface |
MaterialGraph | interface |
MaterialGraphNode | interface |
NODE_SPECS | const |
NativeBridge | interface |
NativeFetchResult | interface |
NativeInputListener | interface |
NativePlatformAdapter | class |
NodeParamSpec | interface |
NodePort | interface |
NodeSpec | interface |
OccluderData | interface |
ParticleEasing | enum |
ParticleEmitter | const |
ParticleEmitterData | interface |
Physics2D | const |
Physics2DEvents | const |
Physics2DEventsData | interface |
PrefabOverride | interface |
PrefabServer | class |
Prefabs | const |
PresentedCameraView | const |
ProjectionType | enum |
ReflectionProbeData | interface |
SceneConfig | interface |
SceneContext | interface |
SceneLoadProgressCallback | type |
SceneManager | const |
SceneManagerState | class |
SceneStatus | type |
SimulationSpace | enum |
SortingGroupData | interface |
SpawnOverride | type |
Spine | const |
SpineAnimation | const |
SpineAnimationData | interface |
SpriteAnimator | const |
SpriteAnimatorData | interface |
SpriteMaskData | interface |
SubEmitterTrigger | enum |
ThemeColors | interface |
TilemapLayer | const |
TilemapLayerData | interface |
TilemapOrientation | enum |
TilemapStaggerAxis | enum |
TilemapStaggerIndex | enum |
TouchPoint | interface |
TransitionConfig | interface |
TransitionOptions | interface |
UICameraData | interface |
UICameraInfo | const |
UINode | const |
UIVisual | const |
UIVisualData | interface |
UIVisualFit | enum |
UIVisualType | enum |
acquireWebGPUDevice | function |
addNode | function |
cameraCommitChanged | function |
cameraFrustumCorners | function |
captureFramePixels | function |
compileMaterialGraph | function |
connect | function |
createHeadlessApp | function |
disconnect | function |
exact | const |
installNativePlatform | function |
loadEsengineModule | function |
moveNode | function |
newMaterialGraph | function |
nodeAdapter | const |
onCameraCommitChanged | function |
presentedCameraView | const |
removeNode | function |
runHeadless | function |
spawnUIEntity | function |
themeColors | function |
transitionTo | function |
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.
What this does not cover
Section titled “What this does not cover”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.