Linux-first animated desktop overlay engine โ render multiple animated characters/sprites over your desktop using transparent, borderless, always-on-top windows with GPU acceleration.
Built in Rust with wgpu (Vulkan/OpenGL) for rendering and winit for windowing. No Electron. No Chromium. Minimal RAM footprint.
- ๐ผ๏ธ Transparent overlay โ borderless, always-on-top window
- ๐ Click-through by default โ desktop is fully usable; characters float on top without blocking input
- โ๏ธ Edit mode (F1) โ toggle to interact with characters (drag, select); press F1 again to return to pass-through
- ๐ฎ Multiple characters โ render several animated entities simultaneously
- ๐ฌ PNG sequence animation โ load frames from a folder
- ๐๏ธ GIF support โ basic animated GIF loading
- ๐ฑ๏ธ Drag & drop โ click and drag characters to reposition them (in edit mode)
- ๐ฏ Click-to-select โ click on characters to select them (in edit mode)
- โฏ๏ธ Play/pause โ global playback toggle (Space key)
- โ๏ธ Per-character config โ position, scale, opacity, FPS, visibility, z-index
- ๐พ Persistent config โ TOML configuration saved to
~/.config/animaEngine/config.toml - ๐จ GPU-accelerated โ wgpu rendering with Vulkan/OpenGL backend
- ๐ฆ Demo included โ starts with 2 demo characters (ghost + slime) generated automatically
Ubuntu/Debian:
# System dependencies
sudo apt install -y \
build-essential \
cmake \
libvulkan-dev \
libx11-dev \
libxcb1-dev \
libxkbcommon-dev \
libwayland-dev \
libxrandr-dev
# Install Rust (if not installed)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/envcd animaEngine
# Build
cargo build
# Run
cargo run
# Run with debug logging
RUST_LOG=debug cargo run| Key/Action | Effect |
|---|---|
| F1 | Toggle edit mode โ pass-through mode |
| Click + Drag | Move a character (edit mode only) |
| Click | Select a character (edit mode only) |
| Space | Toggle play/pause (global) |
| S | Save config manually |
| Escape | Save and exit |
Default behavior: The overlay starts in pass-through mode โ all clicks go through to the desktop. Press F1 to enter edit mode when you want to move characters.
Config is stored at ~/.config/animaEngine/config.toml and auto-created on first run.
[global]
always_on_top = true
transparent = true
playback_enabled = true
window_width = 1920
window_height = 1080
[[characters]]
id = "ghost"
name = "Ghost Demo"
asset_type = "png_sequence"
asset_path = "assets/demo/ghost"
x = 200.0
y = 300.0
scale = 1.5
opacity = 0.9
fps = 12.0
visible = true
playing = true
z_index = 10
[[characters]]
id = "slime"
name = "Slime Demo"
asset_type = "png_sequence"
asset_path = "assets/demo/slime"
x = 600.0
y = 400.0
scale = 1.8
opacity = 1.0
fps = 8.0
visible = true
playing = true
z_index = 20-
Create a folder with your PNG frames:
assets/my_character/ frame_001.png frame_002.png frame_003.png -
Add an entry to
~/.config/animaEngine/config.toml:[[characters]] id = "my_character" name = "My Character" asset_type = "png_sequence" asset_path = "assets/my_character" x = 400.0 y = 200.0 scale = 1.0 opacity = 1.0 fps = 12.0 visible = true playing = true z_index = 30
-
Restart the application.
| Type | Value | Description |
|---|---|---|
| PNG Sequence | png_sequence |
Folder of sorted PNG files (frame_001.png, frame_002.png, ...) |
| Static PNG | png_static |
Single PNG file |
| GIF | gif |
Animated GIF file |
src/
โโโ main.rs # Entry point, logging, demo asset generation
โโโ app.rs # winit ApplicationHandler โ event loop integration
โโโ config.rs # TOML config with serde serialization
โโโ scene.rs # Scene: collection of entities, global controls
โโโ entity.rs # Entity: animated character with transform
โโโ animation/
โ โโโ mod.rs # Animation state: frame cycling, FPS, play/pause
โ โโโ frame.rs # Frame: raw RGBA pixel data
โ โโโ loader.rs # Asset type router + fallback generator
โ โโโ png_sequence.rs # PNG directory loader
โ โโโ gif_loader.rs # GIF frame decoder
โโโ renderer/
โ โโโ mod.rs # Module exports
โ โโโ wgpu_renderer.rs # wgpu device, pipeline, render loop
โ โโโ texture.rs # GPU texture management
โ โโโ sprite.rs # Vertex data, quad generation, projection
โโโ window/
โ โโโ mod.rs
โ โโโ platform.rs # X11/Wayland detection
โ โโโ linux.rs # Compositor detection
โโโ input/
โ โโโ mod.rs
โ โโโ drag.rs # Mouse drag state machine
โ โโโ selection.rs # Click-to-select entity
โโโ shaders/
โโโ sprite.wgsl # WGSL vertex + fragment shader
Full support for:
- โ Transparent window
- โ Borderless/undecorated
- โ Always-on-top
- โ Absolute positioning
- โ Mouse drag
Wayland compositors may limit:
โ ๏ธ Absolute window positioning (compositor-dependent)โ ๏ธ Always-on-top behavior (compositor-dependent)โ ๏ธ Click-through useswl_surface::set_input_regionโ may not work on all compositors
To force X11 on a Wayland system:
GDK_BACKEND=x11 cargo run-
Check compositor: Transparency requires a running compositor
- GNOME/Mutter: compositing is built-in โ
- KDE/KWin: compositing is built-in โ
- Bare X11: install and run
picomorcompton
-
Check GPU drivers: wgpu requires Vulkan or OpenGL support
vulkaninfo | head -5 -
Force OpenGL backend (if Vulkan has issues):
WGPU_BACKEND=gl cargo run
- Some window managers don't respect
_NET_WM_STATE_ABOVE - Try a different WM or use X11 mode
# Install Vulkan drivers (NVIDIA)
sudo apt install nvidia-driver-XXX
# Install Vulkan drivers (AMD)
sudo apt install mesa-vulkan-drivers
# Install Vulkan drivers (Intel)
sudo apt install mesa-vulkan-drivers intel-media-va-driver- Paths in config are relative to the working directory
- Run
cargo runfrom the project root - Or use absolute paths in config
- System tray icon with controls
- Right-click context menu per character
- Per-character play/pause toggle
- Hot-reload config on file change
- WebP/APNG support
- Visual editor for character placement
- Asset pack system (.animapack)
- Physics-based idle animations
- Audio-reactive animations
- AI background remover for sprites
- AppImage/deb packaging
- Full Wayland support (layer-shell protocol)
- Windows/macOS support
- Click-through mode (winit
set_cursor_hittest) - Sprite sheet support (texture atlas)
- MP4/video overlay support
MIT
This is an early MVP. Contributions welcome! Key areas:
- Wayland layer-shell integration
- Click-through implementation
- Better GIF/animation support
- UI/settings panel (egui integration)
- Performance optimizations