Skip to content

AnimaBooter

Flash USB drives with soulFlashea tu USB con alma

  • v0.1.0
  • Rust
  • Tauri 2
  • Svelte 5
  • Tailwind v4
  • MIT
  • 100% local & offline — no telemetry, no cloud, no accounts

flash://sda → gzip · xz · zst · bz2 · iso → written → verified ✓

The pipeline

Three stages, one honest promise

The technical differentiator: flashing is not one blocking loop, it is a pipeline of three cooperating tasks connected by bounded mpsc channels — natural backpressure, no polling, no guesswork.

  1. Reader

    stage 1

    decompress gzip / xz / zst / bz2 · blake3 + sha256 in flight

  2. Writer

    stage 2

    align · write spans · emit honest progress

  3. Verifier

    stage 3

    read-back spans · compare hash · sync_all before done

Free source hashing

blake3 + sha256 are computed while reading the already-decompressed stream. Verifying the written drive costs zero extra passes over the source image.

Overlapped verification

Read-back starts while writes continue, so the verifier hides inside the write window instead of doubling the wall-clock time of every flash.

Honest flush

sync_all before success, always. A green check means the bytes are on the silicon, not just sitting in the page cache.

bounded mpsc channels between stages → natural backpressure: the reader physically cannot outrun the drive.

Why it wins

Small binary, big manners

Everything AnimaBooter does, it does locally, visibly and politely — from the reactive mascot down to the way it refuses to touch your operating system disk.

Parallel 3-stage engine

Reader, writer and verifier run as separate tasks wired by bounded channels — decompress, write and verify overlap instead of queueing up.

Tiny native binary

A native Tauri 2 binary, not an Electron app. The install size target is under 10 MB — a fraction of what Electron-based flashers weigh.

Compressed images, streamed

gzip, xz, zstd and bzip2 images are detected by magic bytes and decompressed on the fly — the image is never fully loaded into RAM.

Reactive mascot + 3 themes

Anima, the mascot, lives through every phase — reading, writing, verifying — across Midnight, Catppuccin Mocha and Tokyo Night themes.

Destructive safety as a feature

Removable-only drive listing, hold-to-confirm for 1.2 s, and a hard OS-disk refusal: your system drive is never offered for flashing.

Bilingual EN / ES

The whole wizard speaks English and Spanish out of the box, with a reactive mascot that lives through every phase.

Screenshots

The four-step wizard, for real

Image → drive → confirm → write. Real captures from the v0.1.0 release — interface in English and Spanish, three themes, reactive mascot included.

Step 1 — drop a disk image on the mascot
1 · Image — drop an .iso / .img / compressed image
Step 2 — choose the target drive
2 · Drive — removable drives only, with serial + bus info
Step 3 — destruction confirmation
3 · Confirm — everything that will be destroyed, in the open
Step 4 — writing with speed, peak and ETA
4 · Write — live speed, peak and ETA
Step 4 — live log with every safety and pipeline step
Live log — every destructive step announces itself first
Flash complete — result card with stats
Done — result card with avg/peak speed, duration, verification

Download

Get the v0.1.0 release

Grab a bundle from the official GitHub release — NSIS / MSI installer (Windows), .dmg (macOS, aarch64) and .deb / AppImage / .rpm (Linux).

⚠️ Early-release software that writes to raw devices — double-check the target drive. Binaries are unsigned: SmartScreen / Gatekeeper will warn on first run (macOS: right-click → Open).

Full release notes on GitHub: release v0.1.0 · all releases

Compare

Where AnimaBooter stands

A factual comparison with well-known flashing tools. No invented benchmarks — only architecture and design choices.

Feature comparison between balenaEtcher, Rufus, usbimager and AnimaBooter
MetricbalenaEtcherRufususbimagerAnimaBooter
Platform coverageWin + macOS + LinuxWindows-onlyWin + macOS + LinuxWin + macOS + Linux
Install size~300 MB~25 MB~2 MB< 10 MB (target)
Write strategysequentialsequentialsequentialparallel 3-stage pipeline
Verification costre-read + re-decompress + re-hashn/aoptionalread-back only — source hash is free
UIElectronWin32minimalSvelte 5 wizard + mascot
TelemetryyesnonoNONE — offline by design

Benchmark cells for AnimaBooter are targets — we publish only real, self-measured numbers. Measure yourself: cargo test && time ./app --flash ...

Verification status

Tested where it's tested

Honesty about what is actually hardware-tested is part of this project's ethos. Release binaries are unsigned; signing and notarization are planned once distribution becomes serious.

Platform verification status: CI coverage vs. real hardware testing
PlatformCompiles (CI)Real flash + boot test
Linuxfmt, clippy, tests, buildverified by the author on hardware (real flash, USB boots)
Windowstests + bundle (MSVC)not yet hardware-tested by the author
macOStests + bundle (aarch64)not yet hardware-tested by the author

Project tree & scale

A codebase you can read in an evening

No monorepo, no generated soup. One Rust backend, one Svelte 5 frontend, and a couple of config files — counted locally, not copied from a dashboard.

animabooter — file tree
animabooter/
├── src-tauri/
│ ├── src/
│ │ ├── commands/ list_drives · detect_image · flash · cancel_flash
│ │ │ eject · get_settings · set_settings · restart_as_admin
│ │ ├── core/ pipeline · reader · writer · verifier · progress
│ │ ├── image/ detect · streaming decompression (gzip/xz/zstd/bz2)
│ │ ├── platform/ linux · macos · windows · unix_common
│ │ └── error.rs safety.rs state.rs lib.rs main.rs
│ ├── capabilities/ default.json
│ └── Cargo.toml tauri.conf.json build.rs
├── src/
│ ├── components/ Wizard · Dropzone · DriveList · ConfirmModal
│ │ ProgressView · ResultCard · Mascot
│ ├── lib/ ipc · stores · types · format · i18n (en / es)
│ └── App.svelte main.ts app.css
├── .github/workflows/ ci.yml (manual) · release.yml (manual or v* tags)
└── vite.config.ts svelte.config.js tsconfig.json index.html
  • 119

    files

  • 6,378

    lines of code

  • 3

    platforms

  • 6

    flash:// event channels

  • 8

    IPC commands

Counted locally with rg --files | wc -l and wc -l across the repo — excluding node_modules, dist, target and .git.

Roadmap

Shipped first, promised later

v0.1 is real, running code. Everything marked planned is honestly not built yet — no vaporware checkboxes.

v0.1
current
  • Parallel 3-stage pipeline
  • Free verification hash (blake3 + sha256 in flight)
  • Wizard UI (4 steps)
  • ResultCard PNG export
  • 3 themes (Midnight, Catppuccin Mocha, Tokyo Night)
  • i18n EN / ES
  • Safety holds (1.2 s hold-to-confirm + OS-disk refusal)
v0.2
planned — not yet built
  • Multi-drive parallel flash
  • Smart-skip: detect already-flashed drives via partial hash
  • animactl CLI
v0.3
planned — not yet built
  • Distro catalog with download + flash

Build it yourself

Local-only, from source

Prefer to run it from source? No app store, no account. Clone the repository and build the desktop app on your own machine with pnpm and cargo.

build-from-source — local shell
# 1 · frontend: install, check, build (pnpm ≥ 9, or Bun / Node ≥ 18)
$ pnpm install
$ pnpm check && pnpm build
# 2 · backend: lint + tests
$ cd src-tauri
$ cargo clippy -- -D warnings && cargo test
# 3 · bundle the native desktop app
$ cd .. && pnpm tauri build
  • Linux — libudev + webkit2gtk-4.1 dev packages

  • Windows — VS Build Tools + WebView2 runtime

  • macOS — Xcode Command Line Tools

Linux udev rule — see removable disks without root

Drop this rule so AnimaBooter can open removable block devices as your user. Reload with udevadm control --reload && udevadm trigger.

# /etc/udev/rules.d/60-animabooter.rules
# adjust group to your distro
KERNEL=="sd*", ATTRS{removable}=="1", SUBSYSTEM=="block", MODE="0660", GROUP="plugdev"

v0.1.0 · MIT (c) 2026 marrionesa · 100% local — no telemetry, no cloud