Animation, frames, and cels
Hexcalibur turns any asset into a frame-by-frame animation by adding a time axis on top of the existing layer stack. The result is a grid: every layer keeps its full stack of pixels at every frame, so a background layer can stay constant while a character layer cycles through poses. The two axes are independent, and that independence is the thing that makes the animation system worth learning.
Two axes, one matrix
Section titled “Two axes, one matrix”
Every animated asset is built around two ideas you already know:
- Layers are the depth axis. They stack on top of each other and composite into the final image, exactly the same way they do on a single-frame asset. Each layer has its own visibility, opacity, and blend mode. See Layers and blend modes for the layer model in full.
- Frames are the time axis. Playback walks through them in order, and each frame has its own playback duration in milliseconds. One frame = one moment in time.
Cross those two and you get a cel matrix: one cell per
(layer, frame) combination. A 4-layer, 12-frame animation has
48 cels in its matrix. Here’s the matrix for a two-layer,
four-frame torch, as the timeline’s Layer-cel grid draws it:

The flame layer changes every frame, so each of its cels is an independent buffer (the dot glyph). The stick never moves, so it’s painted once and linked across the remaining frames (the chain glyph) - one pixel buffer showing up in all four. Played back, those four frames make this:

At any active frame, the compositor walks bottom-to-top through visible layers and blends each one’s cel at that frame. That’s the frame the canvas paints and the 3D preview shows.
What a cel is
Section titled “What a cel is”A cel is the unit of paint content for one layer at one frame.
Picking a different frame in the timeline switches the canvas to
the cel at (active layer, new frame); your next brush stroke
lands in that cel and nowhere else.
Each cel is one of three kinds:
- Buffer - the cel owns an independent pixel buffer that
belongs only to this
(layer, frame). Paint strokes mutate it in place. This is what new painted cels become. - Empty - no buffer, no link. Renders fully transparent. New frames default to empty cels on every layer (so they’re blank canvas).
- Linked - shares pixels with another cel on the same layer via a reference. Painting on any linked cel updates the underlying buffer, which means every cel linked to that buffer updates together. The “share once, edit anywhere” workflow.
The cel matrix decides what every frame of every layer is doing, which is why the Layer-cel grid inside the timeline panel is the most informative view of an animation’s structure.
Linked cels in practice
Section titled “Linked cels in practice”Linked cels are how Hexcalibur keeps a static background painted once across every frame without duplicating the buffer N times. The intended workflow:
- Paint your background layer at frame 0. The cel becomes a buffer cel.
- Add a new frame and pick Duplicate from the right-click
menu. Every layer’s new cel becomes a
linkedcel pointing at the corresponding cel at the source frame. - Continue adding frames. Each layer that hasn’t changed yet keeps its linked cels - that single background pixel buffer shows up on every frame.
- When you want a frame’s content to diverge, right-click the linked cel in the Layer-cel grid and pick Unlink. The linked cel materializes into its own independent buffer cel with a clone of the source pixels; future paints stay local to that frame.
Painting on a linked cel directly also works - it transparently materializes the cel into a buffer cel on the first stroke. The explicit Unlink action exists for when you want to break the link without painting yet.
Deleting the frame a link points at is safe. Since a linked cel doesn’t hold pixels of its own, you might expect deleting the frame it borrows from to leave it blank. It doesn’t - the artwork moves to whichever linked cel is left, and the rest go on sharing from there. Nothing you can see changes.
The right-click menu on any cel also offers Clear (wipe back to empty) and Link to frame… (point this cel at another frame’s cel on the same layer, choosing from a sub-list of candidates).
Tags - named ranges over the time axis
Section titled “Tags - named ranges over the time axis”Tags are how you carve a single animated asset into multiple states. Each tag has:
- A name - usually a state label like
idle,walk,attack. - A color - tints the bar that represents the tag in the tag strip so you can tell them apart at a glance.
- A frame range - inclusive
[from, to]indices on the time axis. - A direction -
forward(play first to last),reverse(play last to first), orping-pong(play 0,1,…,N,N-1,…,1 repeatedly). - An optional fps override - playback uses this rate instead of the per-frame milliseconds when the tag is active.
Clicking a tag scopes playback to its range: the playback clock loops within the tag’s frames and the layer-cel grid highlights the relevant columns. Without an active tag, playback walks the full frame array.
Tags also export with the
sprite-sheet format so that
engines like Phaser, Unity, and Godot can play just the
walk range by name without reading frame indices by hand.
Onion skin
Section titled “Onion skin”Onion skin overlays adjacent frames as ghosts under the active one, so you can see how your animation flows from one pose to the next. Useful when drawing in-between frames - you can see exactly where the previous and next poses sit.
The onion popover (ghost icon in the timeline’s mode cluster) lets you tune:
- Pre / Post frames - how many frames before and after the active one render as ghosts.
- Opacity - dial each side down to a quiet hint or up to a full reference.
- Tint - color each side a different hue so you can tell past from future at a glance. Defaults are red for pre frames and green for post.
- Step - sample every other frame (
2) or every third (3) instead of every consecutive frame, useful for sparser animations. - Scope - choose Active layer (cleaner for character animation) or All visible layers (full context across the stack).
Onion skin is automatically suppressed during playback - the overlays would distract from the animation playing through.
Free vs Pro
Section titled “Free vs Pro”Free accounts have caps on the animation system:
- 5 frames max per asset. The 6th frame would open the upgrade modal instead of being created. Existing assets you created with more frames continue to play, but new frames are gated.
- 1 tag max per asset. The 2nd tag would open the upgrade modal.
Both caps are enforced on every entry point - the Animate
button, the N keyboard shortcut, the + frame tile, and every
right-click duplicate / insert path. Pro accounts have no caps;
the only limit is the frame count’s effect on file size and
playback memory, which is generous on modern browsers.
See Free vs Pro for the complete comparison.
Related
Section titled “Related”- Animation timeline - the UI walkthrough
- Layers and blend modes - the layer model
- Packs and assets - how animations fit in a pack
- Export overview - GIF, APNG, and sprite-sheet exports