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
    / Introduction

    Overview

    What a Nubu Motion script is, where scripts live in the editor, and the controller pattern most projects start from.

    Nubu Motion scripts are small JavaScript programs that compute property values every frame. Where keyframes record motion by hand, a script DESCRIBES motion as a rule: follow that layer, drift gently, count down, fade with distance. The rule stays live - retime a keyframe, rename a layer, scrub a control, and everything driven by the rule follows along.

    One surface: the Scripts panel#

    Scripts live in ONE place: the Scripts destination in the editor's left rail. The panel lists every script in the project with a per-script enable toggle and an evaluated status chip; opening a script raises the floating IDE with completions, live evaluation, lint and the @ pick whip. There are no per-property expression boxes to hunt through: a script declares the properties it drives in its outputs list, and the timeline marks each driven property row with a small read-only indicator naming the script.

    A script is a tiny module:

    export const outputs = ["layer_1:transform.position"];
    
    export function frame() {
      return [value[0] + wiggle(0.8, 24), value[1]];
    }
    

    The engine calls frame() once for every frame it shows. A script with one output simply returns the value; a script driving several properties calls set(target, value) for each. Everything a script can see - the clock, the comp, layers, properties, expression controls - is documented in the General and Objects chapters, and every member's page carries a worked example you can rebuild.

    The controller pattern#

    The most useful shape to learn early: put expression controls (sliders, checkboxes, colours, points, dropdowns, angles) on a layer - conventionally a null named after its job, like Rig - and let a script read them:

    export const outputs = ["layer_2:transform.opacity"];
    
    export function frame() {
      return control("Show planet").value ? 100 : 0;
    }
    

    The control is the surface people touch; the script is the wiring underneath. Controls can be keyframed, exposed as Dynamic Fields and driven by templates and flows, so one honest switch on a rig can steer arbitrarily rich behaviour in the scene - and the same pattern travels inside library components, whose embedded scripts read the component's own controls per instance.

    What the editor shows is what the farm renders#

    There is exactly ONE script runtime, embedded in the editor and in the render farm alike, with the same budgets and the same seeded randomness. A frame you scrub in the editor is the frame the farm renders - deterministically, on every machine. Scripts cannot reach the network, the file system or the clock; a runaway loop is stopped by budget and reported as a typed status, never a freeze. The Determinism page explains why this holds by construction.

    Where to start#

    Work through the Quick start: six small scripts with their scenes spelled out, then a project script driving two comps at once. After that, References and ids explains the name-over-id model the editor uses, and Project scripts covers outputs, scheduling and the rules that keep evaluation predictable.