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.
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.
| 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 | Experimental | certified end to end by two games, but the runtime surface has not been read for a tier yet |
| Particles | Experimental | as tilemap — exercised by a certified game, not yet read for a tier |
| Video | Experimental | the platform paths differ enough that the surface is still converging |
| 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 |
| Networking & replication | Experimental | as AI — the high-level layer waits on the layers under it |
| Materials, lighting, post-processing | Experimental | as 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.
| 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 |
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 |
Assets | const |
AssetsData | type |
Audio | const |
Camera | const |
CameraData | interface |
CameraFields | interface |
CameraTransformFields | interface |
CharacterController | const |
CharacterController3D | const |
ConvexCollider3D | const |
DistanceJoint3D | const |
FixedJoint3D | const |
GraphNodeType | type |
GraphType | type |
HingeJoint3D | const |
Input | const |
InputState | class |
InstantiatePrefabResult | interface |
MaterialGraph | interface |
MaterialGraphNode | interface |
MeshCollider3D | const |
NODE_SPECS | const |
NativeBridge | interface |
NativeFetchResult | interface |
NativeInputListener | interface |
NativePlatformAdapter | class |
NodeParamSpec | interface |
NodePort | interface |
NodeSpec | interface |
Physics | const |
PhysicsEvents | const |
PointJoint3D | const |
PrefabOverride | interface |
PrefabServer | class |
Prefabs | const |
SceneConfig | interface |
SceneContext | interface |
SceneLoadProgressCallback | type |
SceneManager | const |
SceneManagerState | class |
SceneStatus | type |
SliderJoint3D | const |
SpawnOverride | type |
Spine | const |
SpineAnimation | const |
SpriteAnimator | const |
ThemeColors | interface |
TouchPoint | interface |
TransitionConfig | interface |
TransitionOptions | interface |
UICameraData | interface |
UICameraInfo | const |
UINode | const |
UIVisual | const |
acquireWebGPUDevice | function |
addNode | function |
cameraFrustumCorners | function |
captureFramePixels | function |
compileMaterialGraph | function |
connect | function |
createHeadlessApp | function |
disconnect | function |
installNativePlatform | function |
loadEsengineModule | function |
moveNode | function |
newMaterialGraph | function |
nodeAdapter | 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.