Render felis .fcast recordings to video headlessly through felis's renderer
  • Rust 93.3%
  • Nix 6.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
natsukium 7a8a702b0c
All checks were successful
ci / cargo fmt / clippy / test / deny (push) Successful in 57s
chore: follow felis to the v0.1.0 release (#10)
Reviewed-on: ⁨#10⁩
2026-09-26 20:57:56 +09:00
.forgejo/workflows chore: follow felis to the v0.1.0 release (#10) 2026-09-26 20:57:56 +09:00
docs cli: animate cursor blink on the output clock (--cursor-blink) (#9) 2026-09-26 02:17:07 +09:00
src cli: animate cursor blink on the output clock (--cursor-blink) (#9) 2026-09-26 02:17:07 +09:00
tests cli: animate cursor blink on the output clock (--cursor-blink) (#9) 2026-09-26 02:17:07 +09:00
.gitignore feat: render .fcast recordings through felis's offscreen renderer (#2) 2026-09-26 00:53:27 +09:00
Cargo.lock chore: follow felis to the v0.1.0 release (#10) 2026-09-26 20:57:56 +09:00
Cargo.toml chore: follow felis to the v0.1.0 release (#10) 2026-09-26 20:57:56 +09:00
clippy.toml feat: render .fcast recordings through felis's offscreen renderer (#2) 2026-09-26 00:53:27 +09:00
deny.toml chore: follow felis to the v0.1.0 release (#10) 2026-09-26 20:57:56 +09:00
flake.lock feat: render .fcast recordings through felis's offscreen renderer (#2) 2026-09-26 00:53:27 +09:00
flake.nix test: compare fixture renders with golden frames on lavapipe (#5) 2026-09-26 01:00:31 +09:00
README.md cli: animate cursor blink on the output clock (--cursor-blink) (#9) 2026-09-26 02:17:07 +09:00
rustfmt.toml feat: render .fcast recordings through felis's offscreen renderer (#2) 2026-09-26 00:53:27 +09:00

felis-reel

Render a felis-fcast .fcast recording to a video file (MP4, WebM, GIF) or a PNG sequence, headlessly, through felis's own renderer. It plays the role agg plays for asciinema's .cast: felis-fcast records and replays, and felis-reel turns a recording into pixels.

felis-reel <in.fcast> (-o <out.{mp4,webm,gif}> | --frames-dir DIR)
           [--fps N] [--speed X] [--idle-limit SECS] [--cursor-blink]
           [--font-family F] [--font-size PX] [--font-file PATH]...
           [--theme <felis-config>]

Invoked as felis reel … on felis's external-subcommand model, the same way felis fcast … reaches felis-fcast.

Status: proof of concept. It renders MP4, WebM, GIF and PNG sequences; ffmpeg must be on PATH for the video formats (the dev shell provides it). The design is docs/explanation/design.md, and open work is listed in docs/backlog.md.

Development

nix develop enters the dev shell. CI runs cargo fmt --check, cargo clippy -- -D warnings, cargo test --all-features and cargo deny check; run them before sending a change. The golden tests (tests/golden.rs) render on lavapipe with fonts the dev shell pins and skip outside it; FELIS_REEL_BLESS=1 cargo test --test golden rewrites the reference frames after an intended change.

Why a separate tool

felis-fcast does not render recordings by design. A video encoder adds font rasterization, a GPU device, and an encoder to the dependency tree, and record/serve should not have to carry them. The renderer should not own video encoding either. felis-reel sits between the two: it reads the format through felis-fcast's parser and draws with felis's renderer.