Skip to content

Repository files navigation

Cel — ASCII Animation Studio

CI Release License: MIT

Design ASCII animations visually. Export to any format. Ship in seconds.

Website · Download · Documentation


What is Cel?

A desktop app for creating ASCII character-grid animations — CLI spinners, terminal UIs, documentation banners, retro web interfaces. You work with characters on a grid, not pixels.

Keyframe-based timeline. Real-time preview. One-click export to 7 formats.

Quick start

# desktop app
pnpm install && cd apps/desktop && pnpm run tauri dev

# cli
cd apps/cli && cargo run -- play ../presets/sleeping.aanim --loop

Desktop

Editor

  • Visual timeline with draggable keyframes
  • Real-time 60fps preview
  • Sprite layers with drag-and-drop z-ordering
  • Visual cubic bezier easing editor
  • Properties panel (position, opacity, size, rotation, color, easing)

Workflow

  • Undo/redo (30 steps)
  • Native open/save with atomic crash-safe writes
  • Autosave every 400ms
  • Light/dark theme
  • 10 built-in presets
  • Keyboard-driven

Built with Tauri 2 + Rust. Sub-second launch, native menus, under 10MB.

Engine

Zero dependencies. 3.9KB gzipped. Works everywhere.

npm install cel-core
import { sampleScene, serialize, validate } from 'cel-core';

const frame = sampleScene(scene, 1500);     // sample at any time
const json  = serialize(scene);              // deterministic output
const check = validate(input);              // full error paths

React

npm install cel-react cel-core
import { CelAnimation } from 'cel-react';

<CelAnimation scene={scene} autoplay loop speed={1} />

Also exports useCelPlayer hook for custom render targets.

Export

Format Output
.html Self-contained page with embedded player
.tsx Typed React component
.css @keyframes per sprite with cubic-bezier easing
.js ansi Terminal playback script
.js esm ES module with mount()
.aanim Deterministic JSON
.gif Animated GIF (planned)

CLI

$ cel validate scenes/*.aanim
  ✓ 31 files validated, 0 errors

$ cel info presets/sleeping.aanim
  duration: 4000ms (4.0s)
  sprites:  4
  keyframes: 17 total

$ cel play presets/sleeping.aanim --loop

1.4MB static Rust binary.

File format

.aanim — UTF-8 JSON. Alphabetical keys, fixed precision, trailing newline. Every save = clean git diff.

{
  "$schema": "https://cel.dev/schema/v1.json",
  "version": 1,
  "duration": 4000,
  "sprites": [{
    "id": "face",
    "text": "( -_- )",
    "keyframes": [
      { "t": 0, "x": 5.5, "y": 5, "easing": "inout" },
      { "t": 2000, "y": 5.6, "rotation": -1 },
      { "t": 4000, "y": 5, "rotation": 0 }
    ]
  }]
}

Project structure

cel/
├── packages/
│   ├── core/        cel-core     3.9KB engine
│   ├── exporters/   cel-export   7 format exporters
│   ├── player/      cel-player   playback runtime
│   └── react/       cel-react    React component + hook
├── apps/
│   ├── desktop/     Tauri 2 editor
│   └── cli/         Rust CLI
├── presets/          31 bundled .aanim scenes
└── docs/             Landing page + JSON Schema

Numbers

3.9KB gzipped engine 0 dependencies
212 tests passing 100% line coverage
0.6ms per frame render 1.4MB CLI binary
7 export formats 31 bundled presets

Development

pnpm install                  # install deps
pnpm run test                 # 212 tests
pnpm run typecheck            # full type check
pnpm run build                # build all packages

Prerequisites: Node.js 20+, pnpm, Rust stable, Tauri deps

License

MIT

About

Visual ASCII animation studio with timeline editor and multi-format exports.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages