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 propertiesTransform propertiesTrim path properties
    Error codesBudgets
    Changelog
    All docs
    Motion Scripting
    / Properties

    Animators properties

    Driving text animator values and selector ranges from a script, addressed by animator and selector id.

    The text-animator family: each animator's property value tracks - transform deltas, paint lerps, layout shifts, blur, the typography members and the Unicode substitution pair - plus every selector's kind-coherent scalar members, addressed by animator and selector id. Every pattern here reads, keyframes AND drives: a script sweeping a selector's start, end, offset or amount moves the animator's influence across the glyphs per frame, which is the classic scripted text reveal.

    Every pattern below is readable from scripts through prop() and layer.prop(); ids in a pattern (like <effect_id>) stand for the entity's real id. Every pattern here is in the drive set: scripts may WRITE each one with set() or a single-output return, per frame.

    PatternWire kindUnitsReadsWrites
    animators.<animator_id>.blurpoint2px pairyesdrive set
    animators.<animator_id>.character_offsetscalarUnicode stepsyesdrive set
    animators.<animator_id>.character_valuescalarUnicode codepointyesdrive set
    animators.<animator_id>.content.fill_colourcolourrgba (the lerp target)yesdrive set
    animators.<animator_id>.fill.opacityscalarpercent (0..100)yesdrive set
    animators.<animator_id>.fills.<fill_id>.colourcolourrgba (the lerp target)yesdrive set
    animators.<animator_id>.fills.<fill_id>.opacityscalarpercent (0..100)yesdrive set
    animators.<animator_id>.line_anchorscalarpercent (0..100)yesdrive set
    animators.<animator_id>.line_spacingscalarpxyesdrive set
    animators.<animator_id>.selectors.<selector_id>.amountscalarpercent (0..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.correlationscalarpercent (0..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.ease_highscalarpercent (-100..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.ease_lowscalarpercent (-100..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.endscalarpercent (0..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.max_amountscalarpercent (-100..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.min_amountscalarpercent (-100..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.offsetscalarpercent (-100..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.smoothnessscalarpercent (0..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.spatial_phasescalardegreesyesdrive set
    animators.<animator_id>.selectors.<selector_id>.startscalarpercent (0..100)yesdrive set
    animators.<animator_id>.selectors.<selector_id>.temporal_phasescalardegreesyesdrive set
    animators.<animator_id>.selectors.<selector_id>.wiggles_per_secondscalarper secondyesdrive set
    animators.<animator_id>.stroke.colourcolourrgba (the lerp target)yesdrive set
    animators.<animator_id>.stroke.opacityscalarpercent (0..100)yesdrive set
    animators.<animator_id>.stroke.widthscalarpx (additive)yesdrive set
    animators.<animator_id>.strokes.<stroke_id>.colourcolourrgba (the lerp target)yesdrive set
    animators.<animator_id>.strokes.<stroke_id>.opacityscalarpercent (0..100)yesdrive set
    animators.<animator_id>.strokes.<stroke_id>.widthscalarpx (additive)yesdrive set
    animators.<animator_id>.trackingscalarpxyesdrive set
    animators.<animator_id>.transform.anchorpoint2px pair (additive)yesdrive set
    animators.<animator_id>.transform.opacityscalarpercent (0..100)yesdrive set
    animators.<animator_id>.transform.positionpoint2px pair (additive)yesdrive set
    animators.<animator_id>.transform.rotationscalardegreesyesdrive set
    animators.<animator_id>.transform.scalepoint2[x, y] percent (100 = 1:1)yesdrive set
    animators.<animator_id>.transform.skewscalardegreesyesdrive set
    animators.<animator_id>.transform.skew_axisscalardegreesyesdrive set
    animators.<animator_id>.typography.caseenumcase spelling (none|uppercase|lowercase|title)yesdrive set
    animators.<animator_id>.typography.decorationenumdecoration spelling (none|underline|strikethrough)yesdrive set
    animators.<animator_id>.typography.fontfont_reffont referenceyesdrive set
    animators.<animator_id>.typography.paragraph_spacingscalarpxyesdrive set
    animators.<animator_id>.typography.sizescalarpx (the target font size)yesdrive set
    animators.<animator_id>.typography.weightfont_reffont referenceyesdrive set

    Worked examples#

    Animator members are addressed through their owning layer: animators.<animator_id>.<member> for the animator's property values, and animators.<animator_id>.selectors.<selector_id>.<member> for a selector's scalars. A fresh animator carries the default full-range selector selector_1, and driving any of its scalars (start, end, offset, amount) slides the animator's influence across the glyphs per frame - the classic scripted reveal below drives start.

    Worked example: March a reveal across the glyphs#

    The scene. A shaped headline reading NUBU MOTION carrying one text animator named Reveal that hides and drops every glyph, waiting for a script to march the selector across the line.

    • The comp Marquee: 640 by 360 at 25 fps, 100 frames (4 seconds).
    • Headline: a text layer, at [306, 240], filled #e8e6e3, reading "NUBU MOTION".
      • The text animator Reveal (animators.animator_1 in scripts): transform.opacity 0, transform.position [0, 24], with its default full-range selector selector_1.

    The script. Add a project script named March and paste:

    export const outputs = ["layer_1:animators.animator_1.selectors.selector_1.start"];
    
    export function frame({ frame: now }) {
      return linear(now, 10, 60, 0, 100);
    }
    

    Line by line:

    • Line 1: The output addresses the Reveal animator's default selector on the Headline layer: animators.animator_1.selectors.selector_1.start, a percent across the line's characters.
    • Lines 3-4: The animator hides its covered glyphs (opacity 0, dropped 24 pixels); the selector covers start to end, and end rests at 100. Driving start from 0 to 100 between frames 10 and 60 shrinks the covered range from the left, so the glyphs pop up and fade in one after another, left to right - linear() clamps outside the ramp, holding the line hidden before frame 10 and fully shown after 60.

    What you see. The headline starts invisible, then the letters of NUBU MOTION rise into place one after another, left to right, the reveal marching across the line between frames 10 and 60.

    The headline starts invisible, then the letters of NUBU MOTION rise into place one after another, left to right, the reveal marching across the line between frames 10 and 60.