A powerful cross-platform 3D model animation studio — import rigged models, inspect bone hierarchies, hand-author keyframe animations, apply premade humanoid clips, and export polished GLB files. Built with React, Tauri, and Rust, with GitHub Actions for multi-platform builds and releases.
Features • Installation • Usage Guide • Running & Building • GitHub Actions • Icons • Contributing
- About
- Features
- Technology Stack
- Prerequisites
- Installation
- Running the Application
- Usage Guide
- Building for Production
- GitHub Actions (Build & Release)
- Icons Generation
- Project Structure
- Configuration
- Contributing
- Support
- License
- About Roboticela
Animator is a powerful cross-platform 3D model animation studio that makes rigging, inspecting, and animating 3D models accessible to everyone. Designed for game developers, artists, educators, and hobbyists alike, it delivers a professional-grade animation workflow directly in the browser or as a native desktop application.
Built with modern technologies including Tauri, React, React Three Fiber, Three.js, TypeScript, and Rust, Animator brings 3D model animation to life through real-time skeletal rendering, interactive bone gizmos, a keyframe timeline, and a rich premade animation library.
Whether you're polishing a game character, testing a rigged model, creating animated assets for the web, or just exploring 3D animation for the first time, Animator offers a complete workflow from import to export — all running locally on your machine.
The application runs as a native desktop application through Tauri 2 on Linux, Windows, and macOS, and also works entirely in the browser without installation. It includes automated multi-platform build pipelines, release workflows, and asset generation tools.
- ✅ Free and Open Source — Licensed under AGPL-3.0
- ✅ Cross-Platform — Works on Linux, Windows, and macOS, plus in any modern browser
- ✅ Fast & Lightweight — Built with Rust and Tauri for excellent native performance
- ✅ Multiple Format Support — Import GLB, GLTF, FBX, and OBJ models
- ✅ Full Skeletal Inspection — Armature tree, bone hierarchy, and per-bone transform readout
- ✅ Embedded Clip Playback — Plays animations baked into imported files automatically
- ✅ Premade Animation Library — Idle, walk, run, wave, jump, spin, dance, and more
- ✅ Custom Keyframe Authoring — Move / rotate / scale gizmo with per-bone keyframes
- ✅ Timeline Editor — Scrub, play, set in/out points, undo/redo support
- ✅ GLB Export — Native Save dialog on desktop; browser download on web
- ✅ HTML to 3D — Convert HTML content into 3D scene elements
- ✅ Texture Management — Per-material texture maps with live preview
- ✅ Privacy First — Everything stays local; no external servers required
- ✅ No Installation Needed — Runs in the browser without setup
- ✅ Active Development — Regular improvements and feature additions
- Drag-and-drop or file picker import
- Native open dialog on desktop (Tauri)
- Support for GLB, GLTF, FBX, and OBJ formats
- Built-in procedural sample humanoid rig — try without uploading a file
- Automatic scene centering and camera fit on import
- Full armature / bone tree panel with expand and collapse
- Per-bone transform readout (position, rotation, scale)
- Bone selection highlighting in the 3D viewport
- Mesh stats and model hierarchy overview
- Material and texture inspection per mesh
- Plays embedded clips baked into the imported file
- Animated clip list with thumbnail previews
- Virtual scrolling animation grid for large libraries
- Transport controls: play, pause, stop, loop
- Procedural humanoid animations using bone-name heuristics
- Built-in clips: idle, walk, run, wave, jump, spin, dance, and more
- Works with Mixamo, Unity, and VRM naming conventions
- Partial matching for unusual rigs
- Bone gizmo — move (
W), rotate (E), and scale (R) modes - Per-bone keyframe recording on the timeline
- Timeline scrub, play/pause, and in/out point controls
- Full undo / redo (
Ctrl+Z/Ctrl+Y) Spaceto play/pause ·Escto deselect bone
- Per-material texture maps panel: albedo, normal, roughness, metalness, emissive, AO
- Drag-and-drop texture file loading
- Texture folder batch import with auto-mapping prompt
- Live material preview in the viewport
- Convert HTML content into 3D scene elements
- Dedicated panel and modal workflow
- Seamlessly integrates web content into your 3D scene
- GLB export (always GLB for maximum compatibility)
- Native Save dialog on desktop (Tauri)
- Browser download on web
- Bakes custom keyframe animations into the exported file
- React Three Fiber 3D viewport with orbit controls
- Reference image import and overlay for tracing
- Scene lighting controls (ambient, directional, environment)
- Bone skeleton overlay on top of the mesh
- Gizmo controller with axis snapping
- Automated GitHub Actions workflows
- Multi-platform build support (Linux, Windows, macOS, Android)
- Multi-architecture releases
- Asset checksum generation
- Single-source SVG icon generation
- Desktop icons
- Android adaptive icons
- Web favicons and application assets
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript 5.x, Vite 7, TailwindCSS 4, Framer Motion 12, Lucide React |
| 3D / Animation | Three.js, React Three Fiber, @react-three/drei, three-stdlib |
| State Management | Zustand |
| UI Components | Radix UI (Dialog, Dropdown, Slider, Tabs), react-colorful |
| Desktop/Mobile | Tauri 2, Rust |
| Tooling | ESLint, npm, vite-plugin-sitemap |
- Node.js (v20+, workflow uses 24) — Download
- npm — Node package manager
- Rust (latest stable) — Install
sudo apt update
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev \
patchelf libsoup-3.0-dev libjavascriptcoregtk-4.1-devsudo dnf install webkit2gtk4.1-devel openssl-devel libappindicator-gtk3-devel librsvg2-develxcode-select --install- Visual Studio C++ Build Tools
- WebView2 (usually pre-installed on Windows 10/11)
- JDK 17, Android SDK, NDK (e.g. 27.0.12077973 as in workflow)
npx tauri android initonce; see Tauri Android- Windows only: enable Developer Mode (Settings → System → For developers). Tauri links
libapp_lib.sointosrc-tauri/gen/android/.../jniLibswith a symbolic link; without Developer Mode the build fails with "Creation symbolic link is not allowed for this system" (upstream discussion). Keep the project on an NTFS drive (not exFAT/FAT32). - If Gradle/Kotlin reports "this and base files have different roots" (e.g. repo on D: and Cargo/registry on C:), builds can still succeed. If problems persist, put the project on the same drive as your user profile (where
.cargolives) or addkotlin.incremental=falseinsrc-tauri/gen/android/gradle.propertiesaftertauri android init.
git clone https://github.com/Roboticela/animator.git
cd animator
npm installOptional: build Rust for desktop once:
cd src-tauri && cargo build && cd ..npm run devThen open http://localhost:5173.
npm run dev:desktopStarts Vite and opens the Tauri window with hot-reload.
- Launch the Application — Open the built application or run in dev mode
- Import a Model — Drag and drop a GLB, GLTF, FBX, or OBJ file onto the import screen, or click to browse
- Try Without a File — Click "Load Sample" to load the built-in procedural humanoid rig
- Explore the Workspace — The main workspace has four areas: Viewport, Bone Tree, Properties / Timeline, and the Animation Library
- Orbit — Left-click + drag to rotate the camera around the model
- Pan — Middle-click + drag (or right-click + drag) to pan
- Zoom — Scroll wheel to zoom in/out
- Reset Camera — Use the viewport toolbar to fit the model to view
- Select a Bone — Click a bone name in the Bone Tree panel or click a bone in the skeleton overlay
- Switch Gizmo Mode — Press
W(move),E(rotate), orR(scale) - Transform a Bone — Drag the gizmo handles to move/rotate/scale the selected bone
- Deselect — Press
Escto deselect the current bone
- Record a Keyframe — With a bone selected and the timeline open, transform the bone and insert a keyframe at the current frame
- Scrub the Timeline — Drag the playhead to any frame to preview the pose
- Play/Pause — Press
Spaceor click the play button in the timeline toolbar - Set In/Out Points — Use the timeline toolbar to define a play range
- Undo/Redo — Press
Ctrl+Z/Ctrl+Yat any time
- Open the Animation Library — Click "Animations" in the header or panel
- Browse Clips — Scroll through the virtual grid of thumbnail previews
- Apply a Clip — Click a premade animation card to apply it to the current model
- Mix & Edit — After applying, switch to the timeline to fine-tune keyframes
- Click Export — Open the Export modal from the header
- Choose Settings — Confirm the output file name
- Save — Desktop: native Save dialog opens. Web: file downloads automatically
| Shortcut | Action |
|---|---|
W |
Move gizmo mode |
E |
Rotate gizmo mode |
R |
Scale gizmo mode |
Space |
Play / Pause animation |
Esc |
Deselect bone |
Ctrl+Z |
Undo |
Ctrl+Y |
Redo |
npm run build:webOutput: dist/.
npm run build:desktopOutput:
- Linux:
src-tauri/target/<target>/release/bundle/(.deb, .rpm, .AppImage) - Windows:
src-tauri/target/<target>/release/bundle/(.exe NSIS, .msi) - macOS:
src-tauri/target/<target>/release/bundle/(.dmg, .app)
# Linux x86_64 (default on Linux)
npm run build:linux
# Linux ARM64
npm run build:linux:arm64
# Windows
npm run build:win
# macOS ARM64
npm run build:mac:arm64
# macOS Intel
npm run build:mac:intelRust targets must be installed (e.g. rustup target add <target>).
Prerequisites: Android SDK, NDK, and npx tauri android init done once.
# APK (split per ABI)
npx tauri android build --apk --split-per-abi
# AAB (bundle for Play Store)
npx tauri android build --aabSet NDK_HOME if needed (e.g. $ANDROID_HOME/ndk/<version>).
| Platform | Command / note |
|---|---|
| Web | npm run build:web → dist/ |
| Linux | npm run build:linux (or build:linux:arm64) |
| Windows | npm run build:win on Windows |
| macOS | npm run build:mac:arm64 or build:mac:intel on macOS |
| Android | npx tauri android build --apk or --aab (after tauri android init) |
The workflow file is .github/workflows/build-release.yml. It is triggered manually (workflow_dispatch) and:
- Prepares — Patches version in
package.json,src-tauri/tauri.conf.json, andsrc-tauri/Cargo.toml - Builds — Linux, Windows, and Android (each can be toggled on/off)
- Releases — Creates a GitHub Release with artifacts and SHA256/SHA512 checksums
| Input | Type | Default | Description |
|---|---|---|---|
version |
string | "0.1.0" |
Release version (e.g. 1.0.0) |
prerelease |
boolean | false |
Mark release as pre-release |
draft |
boolean | false |
Create as draft release |
build_linux |
boolean | true |
Build for Linux (.deb, .rpm, .AppImage) |
build_windows |
boolean | true |
Build for Windows (.exe, .msi) |
build_android |
boolean | true |
Build for Android (.apk, .aab) |
build_macos |
boolean | false |
Reserved (coming soon) |
build_ios |
boolean | false |
Reserved (coming soon) |
| Variable | Example | Description |
|---|---|---|
APP_NAME |
"Roboticela Animator" |
Display name used in release title and Android signing DN |
NDK_VERSION |
"27.0.12077973" |
Android NDK version installed via sdkmanager |
NODE_VERSION |
"24" |
Node version for actions/setup-node |
If you want release signing for Android (e.g. for Play Store), add these repository secrets:
| Secret | Description |
|---|---|
ANDROID_KEYSTORE_BASE64 |
Base64-encoded .keystore file |
ANDROID_KEY_ALIAS |
Key alias inside the keystore |
ANDROID_KEY_PASSWORD |
Private key password |
ANDROID_STORE_PASSWORD |
Keystore password |
If none of these are set, the workflow generates a self-signed keystore for the build (suitable for testing, not for Play Store distribution).
| Platform | Architectures | Formats |
|---|---|---|
| Linux | x86_64, aarch64, armv7 | .deb, .rpm, .AppImage |
| Windows | x86_64, i686, aarch64 | .exe (NSIS), .msi |
| Android | arm64-v8a, armeabi-v7a, x86, x86_64 | .apk (per ABI), .aab |
The release step uploads all artifacts and adds SHA256SUMS and SHA512SUMS to the release. Verify with:
sha256sum -c SHA256SUMS
# or
sha512sum -c SHA512SUMS- Open the repo on GitHub → Actions → Build and Release.
- Click Run workflow.
- Fill in version (required) and optionally change prerelease, draft, and platform toggles.
- Run; when all selected builds succeed, a release is created (or updated) with the given tag (e.g.
v1.0.0).
Icons are generated from a single source image (default: public/favicon.svg) so that desktop, Android, and web all stay in sync.
npm run icons:generateOr with a custom source path (relative to project root or absolute):
npm run icons:generate -- public/logo.svg
node scripts/icons-generate.js path/to/icon.svg-
Prompts (interactive)
- Android launcher background color — Hex color (e.g.
#0f172a). Previous value is read fromsrc-tauri/icons/android/values/ic_launcher_background.xmland used as default. - Android icon scale — Icon size as percentage of canvas (e.g.
50= 50%). Stored insrc-tauri/icons/android/icon-options.jsonand reused as default next time.
- Android launcher background color — Hex color (e.g.
-
Standard Tauri icons Runs
tauri icon "<inputPath>"to generate desktop icons (e.g. 32x32, 128x128, icon.ico, icon.icns) insrc-tauri/icons/. -
Android background color After
tauri icon, overwrites the Android background color insrc-tauri/icons/android/values/ic_launcher_background.xmlwith the chosen color. -
Android mipmap icons Builds scaled, padded PNGs for Android adaptive icon:
- Launcher:
ic_launcher.png,ic_launcher_round.png(mdpi → xxxhdpi) - Foreground:
ic_launcher_foreground.png(2.25× sizes for adaptive layer)
- Launcher:
-
Web icons Runs
node scripts/copy-vite-icons.js, which copies fromsrc-tauri/icons/topublic/:32x32.png→public/favicon-32x32.png128x128.png→public/apple-touch-icon.pngicon.ico→public/favicon.ico
| Option | File | Description |
|---|---|---|
| Android background color | src-tauri/icons/android/values/ic_launcher_background.xml |
<color name="ic_launcher_background">#rrggbb</color> |
| Scale (percent) | src-tauri/icons/android/icon-options.json |
{ "scalePercent": 50 } — reused as default next run |
When prompted for Android icon scale, you can enter:
- A number 1–100 (e.g.
50) → treated as percent. - A number 0.01–1 (e.g.
0.5) → treated as fraction. - With or without
%(e.g.50%).
The script is interactive by default. For CI or scripts:
- Pipe answers into it (e.g.
echo -e "#0f172a\n50" | npm run icons:generate), or - Pre-create/update
icon-options.jsonandvalues/ic_launcher_background.xmlbefore running.
animator/
├── .github/
│ └── workflows/
│ └── build-release.yml # Build & release workflow
├── public/
│ └── favicon.svg # Default icon source for icons:generate
├── src/ # React frontend (Animator app)
│ ├── App.tsx # Import screen → AppShell when model loaded
│ ├── components/
│ │ ├── animation/ # AnimationPreviewCanvas, VirtualAnimationGrid
│ │ ├── import/ # ImportDropzone landing screen
│ │ ├── layout/ # AppHeader, AppShell, StatusBar, ResizeHandle
│ │ ├── modals/ # About, Guide, Export, AnimationLibrary, SceneInfo,
│ │ │ # Shortcuts, HtmlTo3d, TextureFolderPrompt
│ │ ├── panels/ # BoneTree, AnimationLibrary, Properties,
│ │ │ # ModelHierarchy, TextureMaps, TransformInspector,
│ │ │ # HtmlTo3d
│ │ ├── timeline/ # TimelinePanel, TimelineGrid, TimelineKeyframe,
│ │ │ # TimelinePlayhead, TimelinePlayRange, TimelineToolbar,
│ │ │ # TimelineTrackRow
│ │ ├── viewport/ # Viewport3D, GizmoController, ModelRenderer,
│ │ │ # SceneLighting, ViewportCamera, ViewportToolbar,
│ │ │ # ReferencesRenderer, ReferenceViewportInteractor
│ │ └── ui/ # Button, Panel, Modal, Tabs, NumberInput, etc.
│ ├── hooks/ # useImportReference
│ ├── lib/ # app-actions, export, html-to-3d, model-appearance,
│ │ │ # rcanim, scene-materials, tauri, texture-maps,
│ │ │ # export-formats, export-textures, reference-import
│ ├── store/ # modelStore (Zustand)
│ └── types/ # ModelData, ClipMeta, keyframe types, reference types
├── src-tauri/ # Tauri + Rust
│ ├── src/
│ │ ├── main.rs
│ │ └── lib.rs
│ ├── icons/ # Generated + Android custom
│ │ ├── 32x32.png, 128x128.png, icon.ico, icon.icns, ...
│ │ └── android/
│ │ ├── values/ic_launcher_background.xml
│ │ ├── icon-options.json
│ │ └── mipmap-*/ # Launcher & foreground PNGs
│ ├── capabilities/
│ ├── Cargo.toml
│ ├── tauri.conf.json
│ └── ...
├── scripts/
│ ├── icons-generate.js # Icon generation (tauri + Android + web)
│ └── copy-vite-icons.js # Copy Tauri icons → public/
├── index.html
├── package.json
├── vite.config.ts
├── tsconfig.json
├── LICENSE
└── README.md
src-tauri/tauri.conf.json— App name, version, identifier, window size,beforeDevCommand/beforeBuildCommand, bundle targets, and icon list. Change here for product name and desktop behavior.
vite.config.ts— Vite plugins (React, TailwindCSS, sitemap), dev server port (default 5173), and app/API URL env vars.index.html— Title, favicon links, and all SEO meta tags. Updateog:url,og:image, andcanonicalto match your deployment URL.
vite-plugin-sitemapis configured invite.config.ts. Thehostnameis set tohttps://animator.roboticela.com. Change it to match your actual deployment URL before building.- On
npm run build, asitemap.xmlis generated indist/automatically. - Robots meta and Open Graph tags are set in
index.html.
- Premade animations are defined in
src/lib/rcanim.ts. Each clip uses bone-name heuristics to drive humanoid rigs (Mixamo, Unity, VRM naming). - To add a new premade clip, add an entry to the clips registry in
rcanim.tsand the animation library will pick it up automatically.
The application is entirely client-side — all state lives in memory (Zustand store). No database or local storage persistence is required. Exported files are saved to disk via the browser download API or the native Tauri Save dialog.
The GitHub Actions workflow patches version in:
package.jsonsrc-tauri/tauri.conf.jsonsrc-tauri/Cargo.toml
For local releases, keep these in sync manually or run your own patch step.
- Fork the repository.
- Create a branch:
git checkout -b feature/your-featureorfix/your-fix. - Make changes; follow existing style (ESLint, TypeScript strict mode, Rust fmt/clippy).
- Commit with a clear message (e.g.
Add: ...,Fix: ...,Docs: ...). - Push and open a Pull Request.
- Website: animator.roboticela.com
- Issues: GitHub Issues for bugs and feature requests.
- Repository: Roboticela/animator.
When reporting a bug, please include your operating system, application version, steps to reproduce, expected vs actual behavior, screenshots (if applicable), and any browser console or error messages.
Q: Is this application free to use? A: Yes. It is completely free and open-source under the AGPL-3.0 license.
Q: Can I use this for commercial purposes? A: Yes, but you must comply with the AGPL-3.0 license terms. Any modifications used over a network must be made available to users under the same license.
Q: Does my data get sent to any servers? A: No. All model data, animations, and textures stay entirely on your device. The application works fully offline.
Q: Why does FBX import look different from the original?
A: FBX import is handled by three-stdlib and is best-effort. Complex FBX files with proprietary features may not import perfectly. GLB/GLTF is the recommended format for best results.
Q: Can I export to formats other than GLB?
A: Currently, export is always .glb. GLB is the most widely supported 3D format for web, game engines, and AR/VR applications. Additional formats may be added in future releases.
Q: My premade animations only work on some bones — why? A: Premade animations use bone-name heuristics targeting Mixamo, Unity, and VRM naming conventions. If your rig uses a different naming scheme, the animations may apply partially. Renaming bones to match standard conventions resolves this.
Q: Can I use Animator as a web app without installing anything?
A: Yes. Run npm run dev and open http://localhost:5173, or build and deploy dist/ to any static hosting service.
Q: Can I add my own premade animation clips?
A: Yes. Add entries to the clips registry in src/lib/rcanim.ts. See the Configuration section for details.
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for the full text.
If you modify this software and make it available over a network (e.g. as a web service), you must provide access to the complete corresponding source code under the same license.
Roboticela builds open-source tools for developers, artists, and makers — including Animator, the 3D model animation studio built with React, Tauri, and Rust. Star the repo if you find it useful.
Built with ❤️ by Roboticela
