rive-vs-spine-decision
<!-- Loaded by rive-skeletal-animator when task involves: choosing between Rive and Spine2D, comparing animation runtimes, bundle size tradeoffs, editor cost comparison, React integration comparison -->
$ npx -y skills add notque/vexjoy-agent --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
<!-- Loaded by rive-skeletal-animator when task involves: choosing between Rive and Spine2D, comparing animation runtimes, bundle size tradeoffs, editor cost comparison, React integration comparison -->
Agent definition
rive-vs-spine-decision.mdRive vs Spine2D Decision Reference
<!-- Loaded by rive-skeletal-animator when task involves: choosing between Rive and Spine2D, comparing animation runtimes, bundle size tradeoffs, editor cost comparison, React integration comparison -->
For React web games (Road to AEW): use Rive. Below is why, and when Spine2D is better.
Decision Matrix
| Criterion | Rive | Spine2D | Winner | |-----------|------|---------|--------| | React runtime | First-class (`@rive-app/react-canvas`, hooks) | Manual integration required | **Rive** | | Editor cost | Free (web-based at rive.app) | $69 Essential / $299 Professional | **Rive** | | Editor access | Browser-based, no install | Desktop app (Windows/macOS) | **Rive** | | File format | Single `.riv` | `.skel` + `.atlas` + `.png` (3+ files) | **Rive** | | Runtime bundle | ~150KB WASM (includes renderer) | ~80KB JS + atlas textures (varies) | Spine has smaller JS, but textures add up | | State machines | Built into Editor UI | Code-based (no visual editor) | **Rive** | | Game engine integration | Limited (web/React first) | Excellent (Unity, Unreal, Godot, Cocos2d) | **Spine** | | Community & tutorials | Growing fast (2023+) | Mature, large (10+ years) | Spine | | Animation quality ceiling | Very high | Industry standard | Tie | | Version control | Single `.riv` file, binary | Multiple files, binary | **Rive** (simpler) |
**Verdict for web/React**: Rive wins on runtime integration, editor access, and file management. Spine2D's advantages (game engine ecosystems, community maturity) don't apply to React web games.
Runtime Integration Comparison
Rive in React
import { useRive } from '@rive-app/react-canvas';
const { RiveComponent } = useRive({
src: '/characters/player.riv',
stateMachines: 'CombatStateMachine',
autoplay: true,
});
return <div style={{ width: 400, height: 400 }}><RiveComponent /></div>;First-party hooks handle canvas lifecycle, WASM loading, resize, cleanup.
Spine2D in React
No first-party React package. Integration requires:
1. Install `@esotericsoftware/spine-webgl` or `@esotericsoftware/spine-canvas` 2. Create a canvas element manually with `useRef` 3. Load `.skel` + `.atlas` + texture files separately 4. Build the WebGL/Canvas rendering loop imperatively 5. Manage resize observers manually 6. Handle animation state machine changes via the Spine `AnimationState` API directly
function SpineCharacter() {
const canvasRef = useRef<HTMLCanvasElement>(null);
useEffect(() => {
if (!canvasRef.current) return;
const canvas = canvasRef.current;
const gl = canvas.getContext('webgl2');
// ... load atlas, load skeleton data, create SkeletonRenderer
// ... set up animation state, request animation frame loop
// ... 100+ lines of setup code
return () => { /* cleanup */ };
}, []);
return <canvas ref={canvasRef} width={400} height={400} />;
}Community wrappers (e.g., `react-spine`) are unofficial and may lag behind Spine runtime updates.
Bundle Size Analysis
Rive
- Runtime: ~150KB gzip (includes WASM renderer), loads once
- `.riv` files: target <100KB each (images + animation embedded)
- **Two characters total: ~550KB**
Spine2D
- Runtime: ~80KB gzip (JS only)
- Per character: `.skel` (10–50KB) + `.atlas` (1–5KB) + texture PNG (100–500KB)
- **Two characters total: ~740KB+** (textures dominate for art-heavy characters)
Spine's runtime is smaller, but total asset weight is typically higher because of texture atlases.
State Machine Comparison
Rive State Machines
Built into Rive Editor as visual graph. Designers build and test state machines without code. Inputs (Trigger, Boolean, Number) defined in Editor, accessed by name in code. Live preview with input controls.
Spine2D State Machines
No visual state machine editor. Entirely code-driven:
// Spine2D animation state example
animationState.setAnimation(0, 'idle', true); // track, name, loop
animationState.addAnimation(0, 'attack', false, 0); // queues after idle
animationState.addListener({
complete: (entry) => {
if (entry.animation.name === 'attack') {
animationState.setAnimation(0, 'idle', true);
}
}
});All transitions, conditions, and blending coded manually. Designers must communicate with engineers for any state machine change.
Editor Comparison
Rive Editor (rive.app)
- Free for unlimited projects (paid tiers add team collaboration)
- Web-based, no install, any OS
- Supports: bones, mesh deformation, constraints (IK, transform), state machines, events, blend modes
Spine2D Editor
- Essential: $69 / Professional: $299 (one-time)
- Desktop app: Windows or macOS only
- Binary `.spine` format, hard to diff
- Mature: 10+ years, extensive docs and tutorials
When to Choose Spine2D Instead
| Scenario | Reason | |----------|--------| | Shipping to Unity/Unreal/Godot | Spine has official, production-grade game engine runtimes | | Team already has Spine licenses | No reason to retrain or rebuild existing rigs | | Game is primarily a native app (not web) | Rive's web-first design is a disadvantage in native contexts | | Need battle-tested stability (10+ years) | Spine has deeper track record in shipped games | | Very complex mesh deformation (clothing physics, jiggle) | Spine's Professional tier has more deformation tooling |
For Road to AEW (React 19, web, no game engine): Spine2D offers no advantages over Rive and lacks a first-party React runtime.
Migration Path
If the game expands to native:
1. **Rive for web, Spine for native**: Art assets reusable; rigging/animation redone in Spine 2. **Rive on mobile**: `rive-ios` and `rive-android` runtimes available. Capacitor WebView uses web runtime unchanged 3. **WebGL**: Rive canvas renderer works in any WebGL context
Rive does not lock out native expansion — it defers that complexity.
Summary
Rive for React web games:
- First-party hooks, zero integration work
- Free editor, singl
Read more
Rive vs Spine2D Decision Reference
<!-- Loaded by rive-skeletal-animator when task involves: choosing between Rive and Spine2D, comparing animation runtimes, bundle size tradeoffs, editor cost comparison, React integration comparison -->
For React web games (Road to AEW): use Rive. Below is why, and when Spine2D is better.
Decision Matrix
| Criterion | Rive | Spine2D | Winner | |-----------|------|---------|--------| | React runtime | First-class (`@rive-app/react-canvas`, hooks) | Manual integration required | **Rive** | | Editor cost | Free (web-based at rive.app) | $69 Essential / $299 Professional | **Rive** | | Editor access | Browser-based, no install | Desktop app (Windows/macOS) | **Rive** | | File format | Single `.riv` | `.skel` + `.atlas` + `.png` (3+ files) | **Rive** | | Runtime bundle | ~150KB WASM (includes renderer) | ~80KB JS + atlas textures (varies) | Spine has smaller JS, but textures add up | | State machines | Built into Editor UI | Code-based (no visual editor) | **Rive** | | Game engine integration | Limited (web/React first) | Excellent (Unity, Unreal, Godot, Cocos2d) | **Spine** | | Community & tutorials | Growing fast (2023+) | Mature, large (10+ years) | Spine | | Animation quality ceiling | Very high | Industry standard | Tie | | Version control | Single `.riv` file, binary | Multiple files, binary | **Rive** (simpler) |
**Verdict for web/React**: Rive wins on runtime integration, editor access, and file management. Spine2D's advantages (game engine ecosystems, community maturity) don't apply to React web games.
Runtime Integration Comparison
Rive in React
import { useRive } from '@rive-app/react-canvas';
const { RiveComponent } = useRive({
src: '/characters/player.riv',
stateMachines: 'CombatStateMachine',
autoplay: true,
});
return <div style={{ width: 400, height: 400 }}><RiveComponent /></div>;First-party hooks handle canvas lifecycle, WASM loading, resize, cleanup.
Spine2D in React
No first-party React package. Integration requires:
1. Install `@esotericsoftware/spine-webgl` or `@esotericsoftware/spine-canvas` 2. Create a canvas element manually with `useRef` 3. Load `.skel` + `.atlas` + texture files separately 4. Build the WebGL/Canvas rendering loop imperatively 5. Manage resize observers manually 6. Handle animation state machine changes via the Spine `AnimationState` API directly
function SpineCharacter() {
const canvasRef = useRef<HTMLCanvasElement>(null);
useEffect(() => {
if (!canvasRef.current) return;
const canvas = canvasRef.current;
const gl = canvas.getContext('webgl2');
// ... load atlas, load skeleton data, create SkeletonRenderer
// ... set up animation state, request animation frame loop
// ... 100+ lines of setup code
return () => { /* cleanup */ };
}, []);
return <canvas ref={canvasRef} width={400} height={400} />;
}Community wrappers (e.g., `react-spine`) are unofficial and may lag behind Spine runtime updates.
Bundle Size Analysis
Rive
- Runtime: ~150KB gzip (includes WASM renderer), loads once
- `.riv` files: target <100KB each (images + animation embedded)
- **Two characters total: ~550KB**
Spine2D
- Runtime: ~80KB gzip (JS only)
- Per character: `.skel` (10–50KB) + `.atlas` (1–5KB) + texture PNG (100–500KB)
- **Two characters total: ~740KB+** (textures dominate for art-heavy characters)
Spine's runtime is smaller, but total asset weight is typically higher because of texture atlases.
State Machine Comparison
Rive State Machines
Built into Rive Editor as visual graph. Designers build and test state machines without code. Inputs (Trigger, Boolean, Number) defined in Editor, accessed by name in code. Live preview with input controls.
Spine2D State Machines
No visual state machine editor. Entirely code-driven:
// Spine2D animation state example
animationState.setAnimation(0, 'idle', true); // track, name, loop
animationState.addAnimation(0, 'attack', false, 0); // queues after idle
animationState.addListener({
complete: (entry) => {
if (entry.animation.name === 'attack') {
animationState.setAnimation(0, 'idle', true);
}
}
});All transitions, conditions, and blending coded manually. Designers must communicate with engineers for any state machine change.
Editor Comparison
Rive Editor (rive.app)
- Free for unlimited projects (paid tiers add team collaboration)
- Web-based, no install, any OS
- Supports: bones, mesh deformation, constraints (IK, transform), state machines, events, blend modes
Spine2D Editor
- Essential: $69 / Professional: $299 (one-time)
- Desktop app: Windows or macOS only
- Binary `.spine` format, hard to diff
- Mature: 10+ years, extensive docs and tutorials
When to Choose Spine2D Instead
| Scenario | Reason | |----------|--------| | Shipping to Unity/Unreal/Godot | Spine has official, production-grade game engine runtimes | | Team already has Spine licenses | No reason to retrain or rebuild existing rigs | | Game is primarily a native app (not web) | Rive's web-first design is a disadvantage in native contexts | | Need battle-tested stability (10+ years) | Spine has deeper track record in shipped games | | Very complex mesh deformation (clothing physics, jiggle) | Spine's Professional tier has more deformation tooling |
For Road to AEW (React 19, web, no game engine): Spine2D offers no advantages over Rive and lacks a first-party React runtime.
Migration Path
If the game expands to native:
1. **Rive for web, Spine for native**: Art assets reusable; rigging/animation redone in Spine 2. **Rive on mobile**: `rive-ios` and `rive-android` runtimes available. Capacitor WebView uses web runtime unchanged 3. **WebGL**: Rive canvas renderer works in any WebGL context
Rive does not lock out native expansion — it defers that complexity.
Summary
Rive for React web games:
- First-party hooks, zero integration work
- Free editor, singl
Essays and writing behind this toolkit live at vexjoy.com. AI agents skip steps. "Looks correct" replaces running tests. "Trivial change" replaces verification.
Repo: notque/vexjoy-agent
Other agents on vexjoy-agent.
- ansible-automation-engineer
Ansible automation: playbooks, roles, collections, Molecule testing, Vault security.
Open agent - modules
**Scope**: Module selection patterns, builtin vs command/shell decisions, collection modules, and version-specific module changes **Version range**: ansible-core 2.14+ / Ansible Collections (community.general 7.0+) **Generated**: 2026-04-04 — verify against current Ansible
Open agent - testing
**Scope**: Molecule test scenarios, ansible-lint rules, idempotency validation, and check-mode patterns **Version range**: Molecule 6.0+ / ansible-lint 6.0+ / ansible-core 2.14+ **Generated**: 2026-04-04 — verify against current Molecule and ansible-lint documentation
Open agent - base-instructions
Universal operational rules injected by /do at agent dispatch. Domain-specific rules live in each agent's .md file.
Open agent - communication-patterns
**Scope**: Failure modes in agent output style — over-reporting, self-congratulation, verbose narration, and hedging. Covers what to detect and how to fix each. **Version range**: all versions **Generated**: 2026-05-11
Open agent - combat-effects-upgrade
Zero-dependency combat visual upgrades: CSS particle replacement, Framer Motion combat juice, CSS 3D card transforms.
Open agent

