[Plugin] Xocoatl - Animate your UI elements with Keyframes!

Hey! I’ve been working on Xocoatl, a timeline-based UI animator for Studio, and I wanted to share a little preview.

It’s not out yet, but it might be soon. When it is, I’ll update this post.

I started making it because UI animation felt like something that should be way more visual and fun to work with. I wanted to be able to scrub through an animation, drop keyframes in, tweak things live, and actually see what I was doing, instead of feeling like I was guessing my way through it.

So that’s the idea behind this, no code in the editor, just a timeline, keyframes, playback, and a small runtime to make it work in-game.

What it does

You pick a UI element, open the timeline, and start animating properties like:

  • Position
  • Size
  • Color
  • Transparency

Scrub to a point in time, change a value, move somewhere else, change it again, and your keyframes are there. Hit play, and you can immediately see how it feels.

A few things that are already in there:

  • easing per keyframe
  • multi-select
  • undo / redo
  • live preview while editing

Once you’re happy with an animation, you save it and play it in-game with the runtime.

I tried to keep the whole editor side as visual and low-friction as possible.

Playing it in-game

You install the runtime once from the plugin, then from any LocalScript you can do stuff like:

local Anim = require(
    game.Players.LocalPlayer
        .PlayerScripts.Xocoatl.UIAnimController
)

-- Play once
Anim.play("MyAnimation")

-- Loop
Anim.play("MyAnimation", { loop = true })

-- When finished, do something
Anim.play("MyAnimation", {
    onComplete = function()
        Anim.play("IdleFloat", { loop = true })
    end
})

-- Control by handle
local handle = Anim.play("SlideIn")
handle.pause()
handle.resume()
handle.scrub(0.5)   -- seek to 0.5s
handle.stop()

Runtime features that are really handy

  • One clip, open and close — Design the “open” animation once; play it with reverse = true for close. No duplicate clips.

  • Staggered list revealsAnim.playBatch(cards, "FadeIn", { stagger = 0.06 }) runs the same clip on many elements with a delay between each. One clip, cascade effect.

  • Cleanup before hide/destroyAnim.clearInstance(frame) stops every animation on that element. Use it before setting Visible = false or destroying UI so nothing keeps running.

  • Delay and runAnim.play("ShowcaseAni", { delay = 3 }) starts after 3 seconds. The runtime waits for your UI to exist, so you can call it as soon as the player joins.

  • Reset on finishAnim.play("ClickPop", { reset = true }) restores the element to how it was before the animation. Perfect for one-shot effects (pops, bounces) with zero cleanup code.

  • Chain clipsAnim.sequence({ { name = "SlideIn" }, { name = "Pulse", opts = { loop = 3 } }, { name = "SlideOut" } }) runs them one after another. No nested onComplete callbacks.

  • Control by nameAnim.play("LoadingPulse", { loop = true }) then later Anim.stop("LoadingPulse"). No need to store the handle if you just want to stop by name.

  • Event markers — Put named events on the timeline in the editor; at runtime onEvent = function(name) fires when the playhead crosses them (e.g. play a sound, show text).

So yeah — this is a preview and the plugin isn’t out yet. I’m just one person on this and it’s still evolving. I can’t really get your opinion on some things until you have it — once it’s released I’ll update this post for sure and then I’d love to hear what you think (more properties, export/import, or just “I wish it did X”). For now, no pressure, just sharing what I’ve been building.

Thanks for taking a look — happy to answer questions in the thread.

Chocobasta out <3

26 Likes

This is actually incredible what a feat if you actually make this scalable and fully functional. Such a cool idea instead of us having to do math you could even make pre made button or frame animations as well! Maybe find out people’s favorites and ship it with like 5 pre made animations for hover/click/open/close.

I could 100% see this being sold as a premium tool for devs to use

2 Likes

looks similar to another thing called “motion” but less features, i haven’t tried motion though i’ve followed along with it’s progress while it’s a bit confusing the ui is certainly not the best compared to this. if this had an api for a sort of addon support along side keyframing for different class types (color correction, blur etc) and animation loading this could be an amazing plugin.

1 Like

Thanks for the reply!
I’m definitely working on more an more features, including presets and ways to use them.

1 Like

It’s still in its early stages, working on some smaller bugs and more features, I’ll definitely add blur to animate as well, thanks for the feedback!

Awesome sounds good I’ll keep an eye out maybe for one of my future projects I can incorporate it!

1 Like

Question. Are you prepping this tool to work with frames/buttons/gui elements that are scaled in one, two, or all of the situations below

  1. Size and position by only pixels, ex (0,x,0y)

  2. Size and position by only percentage, ex (x,0,y,0)

  3. Size and position by mixing both scale and pixels, (x1,x2,y1,y2)

1 Like

You’ll be able to mix both or just 1, and you can turn on relative mode so that it scales or moves that much on top of what is is, that makes it so that it’s reusable on a lot of elements.
Like if I’d want buttons to scale on on hover but they are at different pos and scales on the ui, it’ll just add that scale/offset to its current one :smiley:

Ohhhh cool. So you could literally do multiple buttons at once and have this just reference those buttons. Nice touch! What I do is make a collectionservicetag for all the buttons and then assign things like sounds to all buttons with specific tags for things like hover and click. This way I don’t have to in every localscript for GUIS find and attach buttons and take care of duplicating buttons (inventory item adds things like that) and whatever one script handles it all. Haven’t tried visuals yet but I was gonna seeabout trying something soon but not yet. Either way what you’re making here would be really cool to implement into something like that

1 Like

I have got to know when this comes out, it looks AMAZING. Good work!

1 Like

Hi, thanks :))
I’m working hard to release it soon, so users can just play with it and i can get some feedback, it’ll be free on release because i really need some feedback :DD

2 Likes

Will the animation be attached to a specific UI instance, or can it be reused in different UI instances?

1 Like

Im working on that it can be reused, like hover and click animations and so on :))

1 Like

god bless you bro
i need this for free

1 Like

This is really sick! but sadly this is only for ui unlike visulie or motion where you can animate parts and stuff. But hey, i’ll give this a try once it’s out

1 Like

Hey, dropping back in with a quick update before the release.

Things have been moving fast since the last post and it’s close now — close enough that I wanted to say something instead of just showing up one day with a link.


Where things are at

It’s done, basically.
There are still things I want to keep improving, but I hit a point where I’d rather get it in your hands and hear what you think than keep polishing in private. A lot of moving parts went into this — way more than I expected when I started — and I’m genuinely proud of where it landed.


There will be bugs on release

This is a solo project. I’ve tested it a lot, but I’m one person — and no amount of testing by one person catches everything. There are almost certainly edge cases I’ve missed, things that break in setups I didn’t think of, stuff that just feels off somewhere.

That’s not me lowering the bar. It’s just the reality of shipping something like this alone.


Release is soon. I’ll update this post the moment it’s live with the plugin link.

Chocobasta out :heart:

Do you have to manually add each property to be able to animate them? or do they AUTOMATICALLY add to the animator once they are changed?

1 Like

Right now manually, but adding it when changing it, sound like a really good idea!
I’ll add it to my to-do :)) thanks for the idea

1 Like

You’re welcome! some of the current UI timeline animators that exist require you to manually add each input, I feel it would be a good setting to allow it to just automatically detect the movement, thank you!

1 Like

Would love to try this one out!