Nubu
  • Features
  • How it works
  • Pricing
  • Integrations
  • FAQ
  • Contact
  • Docs
  • Blog
  • Log in
  • Log inSign up
    Nubu

    Creative automation for teams that ship campaigns, not busywork.

    Try for free
    Product
    FeaturesNubu MotionHow it worksPricingIntegrationsFAQ
    Company
    AboutContactDocsBlogLog in
    Legal
    Privacy policyTerms of serviceData deletion
    © 2026 Bear Studios · Nubu
    Introduction
    Templates overviewInstalling Nubu BuilderAdding template compsAdding propertiesAdding footageSetting defaultsExporting your templateUploading a template
    Flows overviewAvailable nodesAdding a nodeConnecting nodesWorking with dataTemplates and outputsUsing AI nodesBuilding a creative
    CampaignsTemplatesAssetsGlossariesRendersSettings
    Connecting Meta AdsConnecting Google AdsConnecting OpenAIConnecting Gemini AI StudioConnecting Anthropic
    AI Assistant overviewPrompt examplesAssistant settings and controls
    Nubu Motion scripts: the reference
    OverviewQuick startDifferences from After EffectsDeterminism
    JavaScript supportReferences and idsProject scriptsState and timeBudgets and errorsFormatting values
    GlobalTime conversionInterpolationVector mathsRandom and noiseColour conversionOther maths
    LayerCompPropertyKeyframePathGeometryProjectComponentConsoleComponentControlExpressionControl
    The property vocabularyAnimators propertiesAudio propertiesContent propertiesContents propertiesEffects propertiesExpression controls propertiesFills propertiesInstance controls propertiesLayer propertiesLayout propertiesMasks propertiesStrokes propertiesText style propertiesRig propertiesRigging propertiesRig controllers propertiesRigging weights propertiesRigging mesh propertiesRig items propertiesRig splines propertiesRig simulation propertiesRig properties propertiesRig drivers propertiesRig draw order propertiesTransform propertiesTrim path properties
    Error codesBudgets
    Changelog
    API overviewAuthentication and keysRate limits and errorsUploading assetsFoldersUploading templatesTriggering a flowRuns and creativesAPI Request deliveryCallbacks
    All docs
    Motion Scripting
    / Properties

    The property vocabulary

    How property addresses are built, and the fifteen families of patterns behind every animatable value in a document.

    Every animatable property in a document has a stable address: the owning layer's id, a colon, then the property key - layer_2:transform.position. The key half comes from this vocabulary: 815 patterns across 26 families, generated straight from the engine's own registry, so this reference and the runtime can never disagree.

    GENERATED - nubu-render --print-property-registry over the conformance fixtures; the Ring 0 conformance test pins this block to the generator byte for byte. Every addressable property key by family: prop("<layer_id>:") resolves every listed pattern; writable = the script drive set (a set() / returned value may drive it); a readable-but-not-writable target refuses typed type_mismatch; an unknown key is reference_missing.

    Reading and writing#

    Scripts READ any pattern here through prop() or layer.prop() - keyframes sampled, other scripts' outputs resolved. Scripts WRITE every ANIMATABLE pattern: the drive set is 771 of the 815 patterns - wherever a keyframe could be set, a script may set() the value (or return it from a single-output script) once per frame, and the value overrides the keyframed one for that frame only (nothing is written to the document). Continuous tracks take continuous values; hold-only tracks - text, fonts, blend modes, asset references, a paint's mode and position - take a per-frame hold. Values travel in the wire shape of the row's kind: numbers, [x, y] points, colours as [r, g, b, a] in 0..1 or "#rrggbb", strings for the holds, whole lists for stops, curve points, subpaths, mask paths and width profiles, objects for corner radii, crop transforms and font or asset references. A value of the wrong shape, out of range, or written to a key that is not in the drive set refuses with the typed type_mismatch, and an id that resolves to nothing raises reference_missing.

    Not in the drive set: 44 static patterns that change through commands rather than per frame - content: content.path; effects: 42 static slots (21 enum, 1 layer_ref, 1 point2, 10 scalar, 5 boolean, 1 effect_ref, 3 integer) such as affects, layer, offset, position - every row is on the family page; rigging: rigging.<item_id>.target. A write to any of them refuses type_mismatch with "the property is static". The registry, this page and the IDE's completions move together.

    The families#

    • Animators - 42 patterns.
    • Audio - 1 pattern.
    • Content - 6 patterns.
    • Contents - 9 patterns.
    • Effects - 583 patterns.
    • Expression controls - 1 pattern.
    • Fills - 22 patterns.
    • Instance controls - 1 pattern.
    • Layer - 7 patterns.
    • Layout - 11 patterns.
    • Masks - 9 patterns.
    • Rig - 4 patterns.
    • Rig controllers - 3 patterns.
    • Rig draw order - 1 pattern.
    • Rig drivers - 1 pattern.
    • Rig items - 8 patterns.
    • Rig properties - 9 patterns.
    • Rig simulation - 1 pattern.
    • Rig splines - 4 patterns.
    • Rigging - 8 patterns.
    • Rigging mesh - 1 pattern.
    • Rigging weights - 10 patterns.
    • Strokes - 43 patterns.
    • Text style - 20 patterns.
    • Transform - 7 patterns.
    • Trim path - 3 patterns.