Looping Geometric Motion Graphic
Build a procedural looping animation in Cavalry using zero keyframes.
Introduction
30 Second Summary
Those endlessly looping geometric animations you see on Instagram and Dribbble look like they took hours of careful keyframing. In reality, many are built with procedural tools that let you control hundreds of shapes by changing a single value.
In this project, you will build a seamlessly looping motion graphic of 64 circles that oscillate, pulse, and shift color in a wave pattern using Cavalry's procedural animation system.
What You'll Build
You will create a 2-second looping animation driven entirely by procedural Behaviours and a Duplicator, with zero manual keyframes.
By the end of this project, you'll have:
- A Cavalry scene file (.cv) containing a procedural animation system that controls 64 shapes from a single source.
- An exported video loop (1080x1080, 30fps, 2 seconds) ready for Instagram or Dribbble.
- A working understanding of procedural animation using Duplicators, Oscillators, Stagger, and Color Arrays.
- Secret Mission: Layer a Noise Behaviour on rotation to create an organic generative art piece on top of your clean wave.
Are there any prerequisites?
You need Cavalry installed and signed in with a Canva account. This project requires macOS 12.0 (Monterey) or above.
Cavalry's Starter tier is free forever with no credit card required.
Set Up Your Composition and Explore the Interface
Every animation in Cavalry starts with a Composition. The Composition defines your canvas size, frame rate, and duration.
In this step, you'll orient yourself in Cavalry's interface, learn two essential shortcuts, and create a square composition configured for a seamless 2-second loop.
In this step, get ready to:
- Identify the four core panels in Cavalry's interface.
- Learn the Quick Add and Play/Stop shortcuts.
- Create a 1080x1080 composition at 30fps with a dark background.
Explore the Cavalry interface
Before building anything, take a moment to identify the four panels you'll use throughout this project.
- Look at the centre of the screen. This is the Viewport where your shapes and animation render visually.
- On the left, find the Scene Window. This lists all your layers in a tree hierarchy.
- On the right, find the Attribute Editor. When you select a layer, its properties appear here.
- At the bottom, find the Time Editor. This is your timeline for controlling playback and keyframes.
What are these panels for?
The Viewport is your visual canvas. The Scene Window is your layer list. The Attribute Editor is where you tweak values. The Time Editor controls time.
You'll spend most of this project selecting layers in the Scene Window and adjusting their attributes in the Attribute Editor.
Now learn the two shortcuts you'll use constantly throughout this project.
- Press Cmd + . (period) to open the Quick Add window. This lets you search for and add any layer or tool by name.
- Press Space to play and stop your animation. You can also use the ; key.
Quick Add is your best friend
Instead of hunting through menus, Quick Add (Cmd + .) lets you type the name of anything you need and jump straight to it. You'll use this for every new layer you create.
Create a new composition
Your composition defines the output dimensions and timing of your animation. You'll set it to a square format at 30 frames per second, lasting exactly 2 seconds.
- In the top menu bar, click Composition.
- Click New Composition.
The Composition Settings window opens. Configure the following values:
- Set Resolution to 1080 x 1080. This creates a square canvas ideal for Instagram and social media.
- Set Frame Rate to 30 fps.
- Set the frame range start to 0 and end to 59. This gives you exactly 60 frames, which equals a 2-second loop at 30fps.
- Set Background Color to a dark navy: #1A1A2E.
Why 60 frames for a loop?
At 30 frames per second, 60 frames plays for exactly 2 seconds. When the animation loops, frame 59 connects back to frame 0. Later, you'll tie your animation speed to this exact frame count so the loop is seamless.
Verify your composition is ready
- Check that the Viewport shows a dark square canvas filled with the navy background color.
- Look at the Time Editor at the bottom. Confirm the timeline shows frames 0 to 59.
- Press Space to play. The playhead should move across all 60 frames and loop back to the beginning.
Don't see a dark canvas?
Make sure you set the Background Color in the Composition Settings, not the Viewport canvas color (which is the area outside the composition). Re-open Composition Settings via Composition > Composition Settings and double-check the hex value is #1A1A2E.
Help me fix my Cavalry composition background color
Your canvas is ready. Next, you'll add a shape and use a Duplicator to turn one circle into an entire grid.
Create Your Shape and Duplicator System
Your composition is set up and ready to go. Now it is time to put something on that dark canvas.
In this step, you will create a single circle and then use Cavalry's Duplicator to instantly generate 64 copies arranged in a grid. Instead of manually placing each shape, one layer controls them all.
In this step, get ready to:
- Create a small Ellipse shape as the building block for your animation.
- Add a Duplicator that arranges your Ellipse into an 8x8 grid.
- Preview the grid and experiment with procedural control.
Create a basic Ellipse shape
Every procedural system starts with a single source shape. You will create one small circle that the Duplicator will copy across the canvas in the next substep.
- Open the Quick Add window by pressing Cmd + . (period).
- Type Ellipse in the search field and select it to add it to your scene.
- In the Attribute Editor on the right, set Width to 40.
- Set Height to 40.
- Under the Fill tab, set the Color to white (#FFFFFF).
You should see a small white circle appear in the centre of your dark canvas.
Don't see the circle?
Make sure the Ellipse is selected in the Scene Window on the left. If the Attribute Editor is blank, click on the Ellipse layer to reveal its properties.
If the circle is too small to see, try zooming into the Viewport with your scroll wheel. A 40x40 shape is intentionally small because it will be duplicated many times.
Help me find my Ellipse shape in the Viewport
Add a Duplicator to create the grid
A Duplicator takes any shape nested inside it and replicates it according to a distribution pattern. You will use Grid distribution to arrange 64 copies of your Ellipse across the canvas.
- Select the Ellipse in the Scene Window on the left.
- Open Quick Add again by pressing Cmd + . (period).
- Type Duplicator and select it to add it to the scene.
The Duplicator appears in the Scene Window with your Ellipse nested inside it. You should see multiple circles appear in the Viewport immediately.
- Select the Duplicator in the Scene Window to open its properties in the Attribute Editor.
- Confirm the Distribution is set to Grid (this is the default).
- Set Count X to 8.
- Set Count Y to 8.
- Set Width to 900.
- Set Height to 900.
Your Viewport should now display 64 white circles arranged in an 8x8 grid that fills most of the canvas.
What is a Duplicator?
A Duplicator assigns an index to each copy it generates. This index is what allows other layers (like color utilities or behaviours) to treat each duplicate differently.
You control the entire grid by editing the single Ellipse or the Duplicator's settings. Every duplicate updates instantly. This is the core of procedural thinking in Cavalry.
Circles look bunched together or off-centre?
Double-check that you set the Duplicator's Width and Height to 900, not the Ellipse's. The Duplicator controls the grid's overall size. The Ellipse's 40x40 controls each individual circle's size.
If you only see one circle, make sure the Ellipse is nested inside the Duplicator in the Scene Window. It should appear indented underneath the Duplicator layer.
Help me fix my Duplicator grid layout
Preview and experiment with procedural control
Before moving on, take a moment to see how one value change reshapes the entire system. This is what makes procedural design powerful.
- Press Space to play the timeline.
- Nothing animates yet (you have not added any behaviours), but you should see your 64 circles sitting in the grid.
- Select the Duplicator and temporarily change Count X to 10 and Count Y to 10.
The grid instantly jumps to 100 circles. No copying, no pasting, no repositioning. One value changed the entire scene.
- Set Count X back to 8 and Count Y back to 8 before continuing.
Why procedural over manual?
In traditional animation software, creating a grid of 64 shapes means duplicating, aligning, and managing 64 separate layers. Changing from 8x8 to 10x10 means deleting them all and starting over.
Cavalry's Duplicator treats the grid as a system. You define the rules (shape, count, spacing) and the software handles the rest. This is procedural thinking, and it is the foundational skill for motion design in Cavalry.
Your grid is in place. Next up, you will bring it to life with an Oscillator Behaviour that creates a rippling wave across all 64 circles.
Animate with an Oscillator Behaviour and Perfect the Loop
Your 8x8 grid looks great, but every circle is frozen in place. The real power of Cavalry's procedural workflow is that you can bring everything to life by connecting a single Behaviour to your original shape.
In this step, you'll add an Oscillator Behaviour that makes the circles bob up and down in a staggered wave pattern. Then you'll wire up a Math Utility to guarantee the animation loops perfectly every 60 frames.
In this step, get ready to:
- Add an Oscillator Behaviour to animate Position Y.
- Apply Stagger to create a wave ripple across the grid.
- Connect a Math Utility to lock the loop to your composition length.
Add an Oscillator Behaviour to Position Y
An Oscillator generates a repeating periodic value between two limits. By attaching one to the Ellipse's vertical position, every duplicate in the Duplicator will bob up and down automatically.
- Select the Ellipse in the Scene Window (it is the original shape nested inside the Duplicator).
- In the Attribute Editor on the right, right-click on the Position Y attribute.
- Choose Add Behaviour > Oscillator > Y.
- An Oscillator layer appears in the Scene Window, connected to Position Y.
- In the Attribute Editor for the Oscillator, set Minimum to -50.
- Set Maximum to 50.
What is an Oscillator Behaviour?
An Oscillator produces a smooth, repeating wave between a minimum and maximum value. It is the procedural equivalent of hand-keyframing a property to bounce back and forth forever.
Because this Oscillator is connected to Position Y, each circle moves up 50 pixels and down 50 pixels in a continuous cycle. No keyframes required.
Press Space to preview. All 64 circles bob in unison. That looks neat, but we want a wave, not a synchronized bounce.
Apply Stagger to create a wave
Stagger offsets the timing of the Oscillator for each duplicate in the grid. A small offset between neighbours turns the uniform bounce into a ripple.
- In the Attribute Editor for the Oscillator, find the Stagger attribute.
- Set Stagger to 0.1.
- Press Space to play the animation.
You should see a wave rippling across the 64-circle grid. Each circle starts its bounce slightly after its neighbour, creating a satisfying cascading motion.
How does Stagger work with a Duplicator?
When used with a Duplicator, Stagger offsets the movement in time across duplicates. Each duplicate receives a slightly delayed version of the Oscillator's cycle based on its index in the grid.
A Stagger of 0.1 means each successive duplicate is shifted by 10% of the cycle. Increase it for a tighter wave or decrease it for a gentler ripple.
Don't see a wave?
Make sure you selected the Oscillator layer (not the Ellipse) before setting Stagger. The Stagger attribute lives on the Oscillator, not on the shape itself.
If all circles still move in sync, double-check that the Ellipse is nested inside the Duplicator in the Scene Window. Stagger only works when the Oscillator is evaluated in the context of a Duplicator.
Why isn't my Stagger creating a wave across the grid?
Make the loop frame-accurate with a Math Utility
The wave looks great, but if you watch closely the animation may not loop perfectly at frame 59. To guarantee a seamless loop, you need the Oscillator to complete exactly one full cycle over 60 frames.
A Math Utility divides the composition's Frame Rate by your total frame count to produce the exact frequency value that makes the Oscillator cycle once per loop.
- Open Quick Add by pressing Cmd + . (period).
- Type Math and add a Math Utility.
- Select your Composition in the Scene Window to open the Composition Settings in the Attribute Editor.
- Drag a connection from the Frame Rate attribute in the Composition Settings to the Math Utility's First attribute.
- Type 60 into the Math Utility's Second attribute (this represents your total frame count).
- Set the Math Utility's Operation to Divide.
- Connect math.id to oscillator.frequency.
Why does this create a perfect loop?
The Math Utility divides your Frame Rate (30) by 60 frames, producing 0.5. This tells the Oscillator to complete exactly one full cycle over 60 frames.
If the composition's Frame Rate ever changes, the Math Utility recalculates automatically. The Oscillator will continue to loop on the frame number entered into the Math's Second attribute.
- Press Space to play. Watch the animation loop from frame 0 to 59 and back.
- The first and last frames should connect smoothly with no visible pop or jump.
Seeing a pop at the loop point?
Double-check that the Math Utility's Operation is set to Divide (not Multiply or Add). The connection should flow from the Composition's Frame Rate into First, with 60 typed into Second.
Confirm the output connection goes from math.id into oscillator.frequency. If frequency is disconnected, the Oscillator uses its default speed which will not align with your frame range.
My animation has a visible jump at the loop point. How do I fix it?
Your wave is alive and loops perfectly. Next up, you'll layer on scale pulsing and color to transform this from a technical demo into a vibrant motion piece.
Add Scale Pulse and Color
Your wave animation is looping seamlessly thanks to the Math Utility and Oscillator connection you set up in the previous step.
Movement alone is just the beginning. In this step, you'll layer on a scale pulse so each circle breathes in and out, then assign procedural color so the grid becomes vibrant without touching a single shape by hand.
In this step, get ready to:
- Add a second Oscillator that pulses each circle's scale with staggered timing.
- Use an Index to Color Utility to assign colors procedurally across all duplicates.
- Preview the full animation with movement, scale, and color combined.
Add a scale Oscillator
An Oscillator on Position Y gives you wave motion. Adding a second Oscillator to Scale makes each circle pulse larger and smaller, giving the grid a breathing quality.
- Select the Ellipse in the Scene Window (it's nested inside the Duplicator).
- In the Attribute Editor, right-click on the Scale X attribute.
- Choose Add Behaviour > Oscillator > X.
- In the new Oscillator's attributes, set Minimum to 0.6.
- Set Maximum to 1.4.
- Set Stagger to 0.05.
- Connect the same Oscillator's output to the Ellipse's Scale Y attribute so the circles scale uniformly in both axes.
- Finally, connect the Math Utility's output (math.id) to this new Oscillator's frequency attribute, just like you did for the Position Y Oscillator in the previous step.
Why connect the Math Utility again?
The Math Utility divides the frame rate by 60 to produce a frequency that completes exactly one cycle over your 60-frame composition. Connecting it to every Oscillator guarantees they all loop perfectly in sync.
Without this connection, your scale pulse would drift out of sync with the wave motion and the animation would "pop" when it loops back to frame 0.
Press Space to play. You should see the circles growing and shrinking in a staggered pattern while they continue to wave up and down.
Circles not scaling?
Make sure you selected the Ellipse (not the Duplicator) before adding the Oscillator. The behaviour must be on the original shape for the Duplicator to propagate it across all copies.
Also confirm that the Oscillator is connected to both Scale X and Scale Y. If only one axis is connected, the circles will stretch instead of pulsing uniformly.
Help me troubleshoot my scale Oscillator setup in Cavalry
Apply color with an Index to Color Utility
Right now every circle is white. Instead of manually coloring 64 shapes, you'll use an Index to Color Utility that automatically assigns colors based on each duplicate's index number.
- Open Quick Add by pressing Cmd + . (period).
- Type Index to Color and add it.
- Select the new Index to Color Utility in the Scene Window.
- In the Attribute Editor, add 4 color stops with these values: #E94560, #0F3460, #533483, #16213E.
- Connect the Index to Color Utility's output to the Ellipse's Fill Color attribute.
How does the Duplicator drive color?
A fundamental part of a Duplicator's role is to assign indices to the shapes it generates. The Index to Color Utility reads each duplicate's index number and maps it to a color from your list of stops.
This means all 64 circles receive a color automatically. Change a color stop and every circle that maps to it updates instantly.
You should see the grid of white circles transform into a colorful palette. Each circle takes on a color from your four stops, cycling through them based on its position in the Duplicator's index.
All circles still white?
Check that the Index to Color Utility's output is connected directly to the Ellipse's Fill Color, not to the Duplicator. The connection must target the Ellipse.
If you see only one color across all circles, make sure you added multiple color stops (4 stops, not just one).
Help me connect the Index to Color Utility to my Ellipse
Preview your combined animation
- Press Space to play the full animation.
You should see a colorful grid of circles pulsing in size and moving in a staggered wave. Every single frame is driven procedurally by your two Oscillators and the Index to Color Utility.
Experiment with your values
Try changing the Stagger values on either Oscillator to see how the wave pattern shifts. Increase the Min/Max on the Scale Oscillator for a more dramatic pulse. Swap the color stops for a completely different mood.
Each change instantly updates all 64 shapes. This is the power of procedural thinking.
What should I see?
Your Viewport should show 64 circles in an 8x8 grid, each colored by one of your four stops. The circles should wave up and down with staggered timing, and simultaneously grow and shrink in a slightly different stagger pattern. The combination creates a hypnotic, organic-feeling animation.
Your animation has movement, scale, and color all working together. Next up, you'll export this as a finished loop ready to share.
Export Your Loop
Your procedural animation system is complete. Colorful circles pulse and wave across the grid, all driven by Oscillators and a Math Utility that guarantees a seamless loop.
Now it's time to get this animation out of Cavalry and into a shareable file. The Render Manager handles the entire export process, letting you choose format, quality, and frame range in one place.
In this step, get ready to:
- Open the Render Manager and add your composition to the Render Queue.
- Configure the export format, frame range, and quality settings.
- Render your animation and verify the seamless loop.
Open the Render Manager
The Render Manager is Cavalry's dedicated export panel. It contains a Render Queue where you line up compositions and configure output settings.
- Click Window in the top menu bar.
- Select Render Manager.
- In the Render Manager header, click the + Current Composition button at the top to add your composition to the Render Queue.
A new Render Queue Item appears in the panel. This represents your composition's export job.
What is the Render Manager?
The Render Manager is split into two sections. The Header at the top contains controls for submitting renders. The Render Queue at the bottom holds your Render Queue Items, each one representing a composition to export.
Render Queue Items are saved with the scene, so you can re-render later without reconfiguring.
Configure your render settings
Each Render Queue Item has settings that control what format, frame range, and quality your export uses. You will set these to produce a looping GIF optimised for social sharing.
- In the Render Queue Item, find the Format dropdown and set it to GIF.
- Set the Frame Range Mode to Composition Start/End. This renders your full composition length (frames 0-59).
- Set the Path to your Desktop or preferred output folder.
- Set Render Quality to High.
Why GIF?
GIF is available on the free Starter tier and loops natively on most social platforms. It is the ideal format for a 2-second animation intended for Instagram, Dribbble, or Twitter/X.
If you have the Professional tier, you can also export as MP4 for higher quality. The process is the same. Just select MP4 from the Format dropdown instead.
Don't see the Format or Path fields?
Make sure you expand the Render Queue Item by clicking the expand arrow on its row. All settings are hidden when collapsed.
If the Render Queue is empty, you may have missed the + Current Composition step. Click it now to add your composition.
Help me find the render settings in my Render Queue Item.
Render and verify your loop
With your settings configured, it's time to export.
- Click Render All in the Render Manager header. Cavalry renders all active Render Queue Items.
- Wait for the render to complete. A progress bar shows the export status.
- Navigate to your output folder (Desktop or the path you set).
- Open the exported GIF file. Watch it play and confirm it loops back to the start with no visible pop or jump.
What should I see?
The GIF should play a smooth, continuous loop of your colorful grid animation. The last frame connects seamlessly back to the first frame because your Math Utility ties each Oscillator's frequency to exactly one cycle over 60 frames.
Seeing a pop or jump at the loop point?
This means at least one Oscillator is not completing a full cycle within 60 frames. Check that your Math Utility output is connected to the frequency input of both the Position Y Oscillator and the Scale Oscillator.
Also verify the Math Utility's Second attribute is set to 60 and the Operation is set to Divide.
Help me fix my loop so it doesn't jump at the end.
Secret mission
Add Generative Noise Rotation
Your animation is clean and rhythmic. But what if you layered something organic on top? In this secret mission, you will add a Noise Behaviour to drive rotation, creating a generative art piece that combines structure with randomness.
Clean Up Your Resources
Clean Up Your Resources
Decide whether to keep your resources running, pause them to come back later, or delete them entirely. This project runs entirely locally, so there are no ongoing costs.
Resources you used:
- 1 Cavalry scene file (.cv) saved locally.
- 1 exported GIF file saved to your Desktop or preferred output folder.
Keep everything running
No action needed. Choose this if you're still actively building or want to iterate on your animation.
- Save your .cv file somewhere easy to find. This is your reusable template for future variations.
- Try changing the Duplicator's Distribution from Grid to Circle for a radial version of the same animation.
- Post your loop to Instagram, Dribbble, or Twitter/X with #MadeInCavalry.
Pause - I'll come back to this later
Close Cavalry to free up memory. Your scene file stays on disk until you reopen it.
- Save your scene in Cavalry using Cmd+S if you haven't already.
- Quit Cavalry.
- Your .cv file and exported GIF remain on your machine, ready to reopen anytime.
Delete - I don't want to use this again
Remove all project files from your machine.
- Delete your Cavalry scene file (.cv) by moving it to the Trash in Finder.
- Delete your exported GIF file from your Desktop (or wherever you saved it) by moving it to the Trash.
- Empty the Trash to permanently remove the files.
Nice Work!
Nice Work!
You just built a seamlessly looping geometric motion graphic using Cavalry's procedural tools. Zero keyframes, infinite variations.
What you learned:
- Built a procedural animation system using a Duplicator to control 64 shapes from a single source, with Oscillator Behaviours and Stagger creating wave motion with zero keyframes.
- Set up a frame-accurate loop using a Math Utility to tie Oscillator frequency to composition length, guaranteeing seamless playback.
- Applied an Index to Color Utility driven by the Duplicator's index system to assign colors procedurally, then exported a portfolio-ready loop via the Render Manager.
- Secret Mission: Layered a looping Noise Behaviour on Rotation to create organic generative motion, combining rhythmic structure with randomness.
Ready to quiz yourself?