Skip to content

Frame tags ​

Named coloured ranges over the frames timeline. Useful for marking out walk-cycle, idle, attack, death sub-ranges on a single shared timeline so you (and the engine consuming the export) can locate sequences quickly.

Tags are positional (Aseprite-style): they reference frame indices, not frame ids. If you reorder frames, the indices stay the same — retarget the tag explicitly if needed.


Where to find it ​

A bar above the frame thumbnails in the Frames timeline.

Frame tag bar


Anatomy ​

  • Tag bar — coloured rectangles spanning the affected frames. Each tag's bar:
    • Width = (toIndex − fromIndex + 1) frames
    • Position = aligned to the underlying frame thumbnails (slot width = 64 px + 8 px gap)
  • + Tag button — adds a new tag covering only the active frame.
  • Tag editor — appears below the bar when you click a tag.

Create a tag ​

  1. Click the frame you want the tag to start on.
  2. Click + Tag. A tag is created covering that single frame, with a default name and colour.
  3. The editor opens automatically. Use it to expand the range, rename, recolour, or change direction.

Tag editor ​

ControlWhat
Color pickerTag's bar colour (any hex).
NameTag identifier.
From / To1-based frame indices the tag covers (inclusive both ends).
Directionforward / reverse / pingpong — playback hint for animations referencing this tag.
TrashDelete the tag.
×Close the editor without deleting.

Tag editor open


Direction hints ​

The direction field is metadata for tools that consume tag ranges:

  • forward — play 1 → 2 → … → N
  • reverse — N → N−1 → … → 1
  • pingpong — 1 → 2 → … → N → N−1 → … → 1

Direction is exported to .mstack and to JSON via the sprite-sheet exporter — engines like Aseprite-compatible importers, Phaser, or Godot can use it directly.


Tag invariants on frame mutations ​

The editor automatically adjusts tag ranges:

  • Insert frame at index i → tags fully after i shift by +1; tags whose range contains or starts at i extend by 1 (the new frame becomes part of the tag).
  • Delete frame at index i → tags after i shift by −1; tags overlapping i shrink by 1; tags whose only frame was i are removed.
  • Reorder frame → tags don't move. Indices stay the same. (Aseprite-positional, not identity-tracking.)

Why use tags? — concrete examples ​

🎮 Game character with multiple animations on one sheet ​

You have a single character sprite sheet with all animations packed into one timeline:

FramesAnimation
1–4idle
5–12walk
13–18attack
19–22hurt
23–28die (forward only — direction: once would be a tag-level hint, here we use forward)

Without tags, you'd have to remember "walk is 5–12" forever. With tags, the timeline shows coloured bars labelled idle, walk, attack, … above each range. You can rename, recolour, and re-target them as the project grows.

Bonus: when you export to a sprite sheet with JSON, the JSON includes a frameTags array. Engines like Phaser, Solar2D, and several Godot importers read this directly so your code can do sprite.play('walk') instead of sprite.play(5, 12). Same effect, way more readable.

📌 Visual landmarks in long timelines ​

Even if you never export the tags, they're useful for navigation. With a 60-frame project, "I want to fix the death animation" is much easier when there's a red bar labelled die at frames 50–60 than scrubbing through thumbnails.

↪️ Direction hints ​

direction (forward / reverse / pingpong) is metadata. It doesn't change how the editor plays the timeline, but it's exported so the consuming engine can use it. Useful when you reuse one set of frames for multiple play modes — e.g. a "rise" animation (forward) and a "fall" animation that reuses the same frames in reverse.

When tags aren't the right tool ​

  • For alternative organisation of frames as named sets that can overlap, prefer Sprites. A frame can belong to multiple sprites; with tags, frames belong to a single global timeline.
  • For playback sequences with custom step ordering and loop modes, use Animations. Animations can reference any subset of frames in any order; tags are just "this contiguous range has a name".

Tips ​

  • Tags are per-project, not per-sprite. They live on the global frameOrder.
  • Use a distinctive colour for each tag — the editor auto-rotates 8 default colours to start.
  • The editor caps tag colours to hex — if you copy/paste a colour, make sure it's a 6-character hex string.
  • The bar truncates the tag name when it's too narrow — hover over the tag to see the full info in a tooltip.

Motestack is a personal hobby project. The editor and these docs ship under no warranty — back up your `.mstack` files.