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

Xocoatl — UI Animator

Keyframe timelines, easing, optional 2D UI particles, a tiny runtime, colour picker, and layout tools — polish your Studio UI without fighting the property panel.

Documentation — open docs site

Discord — join server

Install on Creator Store →


I’ve been building this for a long time — lots of rewrites and “one more fix” before posting. It’s here now and I’m genuinely happy with where it landed.

Below is everything the plugin does today, so this thread stays a single place to see what you’re getting.


Timeline Animator

1c7b6599-0d95-49c2-a590-2e2aea013faf-render-ezgif.com-video-to-gif-converter

The core workflow: set an animation targetopen or create a clip → add elements from the Hierarchy → add property tracks → keyframe on the timeline → preview → save.

  • Edits run on a preview clone (StarterGui/_UIAnimPreview) so your real UI isn’t touched until you close the animation and test in-game.

  • Always close the animation before pressing Play in Studio — otherwise the clone can show up in the running game.

Tracks, keyframes & easing

  • One row per element; [+] opens a searchable property picker (Position, Size, Rotation, transparency, colours, UIGradient sequences, booleans like Visible/Enabled, and more — see docs for the full list).

  • Per-keyframe easing — right‑click a diamond: Linear, Quad, Sine, Back, Bounce, Elastic, etc., with In / Out / InOut and a small curve preview.

  • Delta mode on any property track — keyframes become offsets from the starting value, so one clip can reuse on different buttons or slots without fixed coordinates.

  • Compound sub-rows — expand Position / Size / Colour tracks for per-component control (e.g. axes or RGB).

  • Multi-select workflows for keyframes and compatible tracks; Edit → Copy / Paste Keyframes for time-based clipboard workflows.

Colour & effects

  • Colour swatches on Color3 tracks open the integrated colour picker (same preset/palette system as the standalone picker).

  • Screen effects — animate BlurEffect, ColorCorrectionEffect, BloomEffect, Camera FOV, etc. The runtime can create and tear these down for you.

2D particle system (experimental)

  • On supported hosts (Frame, ImageButton, ImageLabel, TextLabel, TextButton, CanvasGroup): element row Make Particle Frame.

  • Particle rows live on the same timeline as the rest of the UI — rate, lifetime, speed, spread, texture, emission edge, optional Motion / Velocity inheritance, lifetime Size / Transparency sequences (Seq editor with optional live preview), and more.

  • Emit containerScreenGui (full-screen particle layer) or Emitter (parent under the frame for clipping/stacking with that UI).

  • Clip-wide options (Track list Particles block + Animation menu):

  • Keep particles emitting after clip ends — after a forward finish, particles can keep spawning at the last sampled time until you stop that playback key or clear the instance.

  • No particle emit on reverse — hover-out / reversed playback stops new spawns; existing particles age out (great for menu polish).

Particles are experimental — behaviour and defaults may evolve; still great for prototyping and shipped UI once you’ve tested your build.

getsitecontrol__convert-video-to-gif__free

getsitecontrol__convert-video-to-gif__free (1)

Authoring & workflow extras

  • Template animation — design a clip without locking it to one saved UI root; at runtime use { target = guiObject } or Anim.playOn so one clip drives many instances (menus, inventory slots, cards).

  • Timeline events — place named markers on the ruler (right‑click ruler → place event); fire onEvent in Lua when playback crosses them.

  • Clip folders / saves browser — organise animations under ReplicatedStorage/ChocosToolsSaves/SavedUIAnimations; multi-select moves in the browser where supported.

  • Export UI + Animation / Import UI + Animation — bundle UI + clip for sharing or moving between places (File menu).

  • Preview in Container — try the clip inside another ScreenGui context when you need it.

  • Undo / redo — full stack for keyframes, tracks, hierarchy changes, easing, and more.


Playing animations in-game (runtime)

Install once from the Timeline landing screen (Install / Update Runtime) → scripts land under StarterPlayerScripts/Xocoatl.


local Anim = require(

game.Players.LocalPlayer.PlayerScripts.Xocoatl.UIAnimController

)

Anim.play("ShopOpen")

-- Same clip backwards — open once, close for free

Anim.play("ShopOpen", { reverse = true })

Anim.play("IdleFloat", { loop = true })

Anim.play("Intro", { delay = 3 })

Anim.play("ClickPop", { reset = true })

-- Ping-pong, loop counts, speed — all supported

Anim.play("Breathe", { loop = true, pingpong = true })

local handle = Anim.play("SlideIn")

handle.pause()

handle.resume()

handle.scrub(0.5)

handle.stop()

Highlights:

| API | What it’s for |

|-----|----------------|

| Anim.playOn(inst, "Clip") | Clip was authored as template or you want a different root than the saved target. |

| Anim.play("Clip", { target = inst }) | Same idea — explicit override. |

| Anim.bindHover(btn, "HoverClip") | MouseEnter forward / MouseLeave reversed — one line hover polish. |

| Anim.bindButton(btn, hover?, click?, opts?) | Hover + click clips with sensible keys and optional resume behaviour. |

| Anim.playBatch(list, "Clip", { stagger = 0.06 }) | Lists, grids, cascaded reveals. |

| Anim.sequence({ { name = "A" }, { name = "B" } }) | Chain clips without nesting callbacks. |

| Anim.clearInstance(frame) | Stop everything targeting that UI root before hiding/destroying it. |

| Anim.stopOn(inst, "Clip") | Stop a named clip bound to an instance. |

| onEvent / events | React to timeline markers or scripted time callbacks. |

| Handles | Completed, Cancelled, MarkerReached, Looped signals alongside options. |

Particles in clips — if the saved clip has particle tracks, Anim.play runs the same simulator as the editor: tails drain on interrupt when possible (no hard pop), with the clip flags above controlling post-end emission and reverse behaviour.


Hierarchy explorer

Left panel: full tree under the animation target, search filter, collapse/expand with L on selection, Add From Selected (Explorer multi-select → one click into the Track List).


UI Tools dock

5eba6d67-e564-4de1-8000-674c332f0a82-render-ezgif.com-video-to-gif-converter

Open Tools from the toolbar — six draggable slots. Pick from:

  • Align — 3×3 AnchorPoint + Position grid; multi-instance.

  • Simple Move — nudge by scale or offset step.

  • Color Presets — apply saved presets (Background / Text / Image / gradients via UIGradient); palettes sync with the Colour Picker.

  • Rich Text — WYSIWYG for TextLabel / TextButton / TextBox (bold, italic, underline, colours, stroke, etc.).

  • Conversion — Scale ↔ Offset for Size/Position; aspect constraint helpers.

  • UI Converter — reparent-friendly class swaps (Frame ↔ ImageLabel, etc.).

  • Copy Path — dot-separated Explorer path for scripts.

Xocoatl features (from the Tools dock) — optional overlays such as a viewport selection breadcrumb; off by default.


Colour Picker (standalone)

Third toolbar button — full picker + palettes / presets shared with timeline colour tracks and Color Presets in Tools.


Docs & support

Documentation — runtime API, particles guide, delta mode, templates, hover, batch/sequence patterns, install steps. Community: Discord.

If something’s confusing or missing, tell me and I’ll extend the docs.


This is a solo project — bugs and rough edges are possible. Options → Report in the plugin links to GitHub for bugs and feature requests, or reply here.

Thanks for sticking with it since the early previews. Hope it saves you time.

Chocobasta out :heart:

43cd8f0f-3926-4724-82d9-0b689a567d27-render-ezgif.com-video-to-gif-converter

102 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

4 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!

2 Likes

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)

2 Likes

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

3 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:

2 Likes

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!

1 Like